Как неправильно это должно создать делегата обработчиков событий со стандартом (Отправитель Obj, EventArgs args) подпись?

Режущая проблема серьезна, потому что она может привести к повреждению памяти, и очень трудно гарантировать, что программа не страдает от нее. Для разработки его из языка классы, которые поддерживают наследование, должны быть доступными ссылкой только (не значением). Язык программирования D имеет это свойство.

Считают класс A и класс B полученными из A. Повреждение памяти может произойти, если часть имеет указатель p и экземпляр B, который указывает на p на B дополнительные данные. Затем когда дополнительные данные отрезаны, p указывает на мусор.

13
задан Eric Anastas 21 July 2009 в 03:00
поделиться

3 ответа

Вы можете сделать что-нибудь неправильно, если только вам придется с этим иметь дело. Но неплохо изучить стандарты и придерживаться их, чтобы сохранить хорошие привычки, когда вы работаете над кодом с другими.

Так что я заключу с вами сделку. Если вы пообещаете сделать это правильно, я дам вам фрагмент кода, который облегчит вам задачу. Просто поместите это в файл .snippet и поместите этот файл в:

Мои документы \ Visual Studio 2008 \ Code Snippets \ Visual C # \ My Code Snippets \
(или Visual Studio 2005, если применимо)

А вот фрагмент; используйте его в VS, набрав ev2Generic и нажав Tab:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Generic event with two types/arguments.</Title>
      <Shortcut>ev2Generic</Shortcut>
      <Description>Code snippet for event handler and On method</Description>
      <Author>Kyralessa</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type1</ID>
          <ToolTip>Type of the first property in the EventArgs subclass.</ToolTip>
          <Default>propertyType1</Default>
        </Literal>
        <Literal>
          <ID>arg1Name</ID>
          <ToolTip>Name of the first argument in the EventArgs subclass constructor.</ToolTip>
          <Default>property1Name</Default>
        </Literal>
        <Literal>
          <ID>property1Name</ID>
          <ToolTip>Name of the first property in the EventArgs subclass.</ToolTip>
          <Default>Property1Name</Default>
        </Literal>
        <Literal>
          <ID>type2</ID>
          <ToolTip>Type of the second property in the EventArgs subclass.</ToolTip>
          <Default>propertyType2</Default>
        </Literal>
        <Literal>
          <ID>arg2Name</ID>
          <ToolTip>Name of the second argument in the EventArgs subclass constructor.</ToolTip>
          <Default>property2Name</Default>
        </Literal>
        <Literal>
          <ID>property2Name</ID>
          <ToolTip>Name of the second property in the EventArgs subclass.</ToolTip>
          <Default>Property2Name</Default>
        </Literal>
        <Literal>
          <ID>eventName</ID>
          <ToolTip>Name of the event</ToolTip>
          <Default>NameOfEvent</Default>
        </Literal>
      </Declarations>
      <Code Language="CSharp">
        <![CDATA[public class $eventName$EventArgs : System.EventArgs
      {
        public $eventName$EventArgs($type1$ $arg1Name$, $type2$ $arg2Name$)
        {
          this.$property1Name$ = $arg1Name$;
          this.$property2Name$ = $arg2Name$;
        }

        public $type1$ $property1Name$ { get; private set; }
        public $type2$ $property2Name$ { get; private set; }
      }

      public event EventHandler<$eventName$EventArgs> $eventName$;
            protected virtual void On$eventName$($eventName$EventArgs e)
            {
                var handler = $eventName$;
                if (handler != null)
                    handler(this, e);
            }]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
6
ответ дан 1 December 2019 в 22:58
поделиться

Используйте универсальные делегаты EventHandler для ваших событий и создайте тип, производный от EventArgs , для хранения данных вашего события. Другими словами, всегда. Это то, что вы всегда точно знаете, как это работает, когда сталкиваетесь с этим, потому что это никогда не было сделано иначе.

Изменить:

Анализ кода CA1003: Используйте экземпляры универсального обработчика событий
Анализ кода CA1009 : Правильно объявляйте обработчики событий

10
ответ дан 1 December 2019 в 22:58
поделиться

На практике, как часто люди [не использовать производные классы от EventArgs].

Я никогда не встречал случая, чтобы классы, производные от EventArgs, не использовались. Как вы сами говорите, это увеличивает вашу способность изменять код позже. Я бы также сказал, что удобочитаемость улучшена, поскольку легко увидеть, что это обработчик событий.

Стоит ли создавать отдельный NameChangedEventArgs класс или для простые события вроде этого приемлемо просто вернуть аргументы непосредственно через делегировать аргументы?

Кажется, вы говорите, что вы бы использовали EventArgs для обработчиков событий с большим количеством параметров и не использовали бы его для подобных случаев. Честно говоря, это просто не вариант при программировании на C #. Последовательность является обязательной, особенно в сегодняшнем мире подобных форумов, проектов с открытым исходным кодом и т.д., где ее легко потерять. Конечно, если вы программируете это под камнем, вы можете делать все, что захотите, но большее сообщество C # поблагодарит вас за соблюдение стандартов и особенно за использование согласованности в вашем коде.

4
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: