Категоризация событий C #, делегатов, обратных вызовов и т. Д.

Я думаю, простой вопрос: как вы классифицируете / называете элементы, связанные с событиями, в C #?

Например, мои текущие соглашения выглядят примерно так:

public class A
{
    ...
    #region Delegates
    public delegate void CallIncomingEventHandler(string displayName);
    #endregion


    #region Event Handlers
    public event CallIncoming;
    #endregion
    ...
}

public class B
{
    ...
    #region Events
    private void A_CallIncoming(string displayName)
    {
        // do stuff here
    }
    #endregion
}

Меня беспокоит определение типов SomethingEventHandler с помощью модификатора «делегат» и их вызов «Делегаты», затем определение полевых событий с помощью модификатора «событие» и их вызов «Обработчики событий», а затем вызов методов, которые реагируют к событиям "События".

Мое название правильное?

Я могу создавать и использовать настраиваемые события и т. Д., Но мне нужна помощь, чтобы понять имена компонентов и то, как другие их организуют.

Спасибо.


person user1518816    schedule 07.03.2013    source источник
comment
Я начал просто группировать по трем категориям: общедоступный / защищенный / частный, свойство / недействительный метод / непустой метод / поле / событие и по алфавиту внутри них. В определенных случаях я счел полезным сгруппировать все методы, относящиеся к конкретной реализации интерфейса, в отдельном файле с именем classInterface.cs, но я использую это экономно. Я использую регионы, но только для очень больших классов (которых я тоже стараюсь избегать).   -  person Pieter Geerkens    schedule 07.03.2013
comment
Это соглашение об именах, которое используется в Framework. Например, FormClosing (событие) и FormClosingEventHandler (делегат) и FormClosingEventArgs (аргументы события). Похоже, неплохо было бы следовать здесь соглашениям Framework.   -  person Jim Mischel    schedule 07.03.2013


Ответы (2)


Вы описали соглашения, которые используются в .NET, не так ли?

Лично я не вижу проблем в вашем подходе. Это хорошо известно, и каждый разработчик, работавший с .NET, скорее всего, будет ожидать если не такого же соглашения, то близкого к нему. Так зачем изобретать что-то новое, когда существует принятая конвенция?

Вместо этого я бы предложил подумать о том, как события будут вызываться в ваших классах и как вы, например, расширите параметры для делегатов в будущем? Хорошей отправной точкой здесь было бы снова следовать соглашению .NET с такими делегатами, как delegate void SomethingEventHandler(object sender, EventArgs e). Хорошие мысли по этому поводу были даны в этом вопросе.

Надеюсь, это уменьшило ваши сомнения.

person Alexander Manekovskiy    schedule 07.03.2013

На всякий случай кому-то другому/новичку в С# нужны более конкретные объяснения/примеры:

public class ExampleClass
{
    // DelegateNames = NameOfObject + Verb + ("ed" or "ing") + "Handler".
    // NameOfObject  = Data, File, Property, Value, Window, Settings, User,...
    // Verb          = Open, Close, Format, Clear, Delete, Create, Insert, Update, Refresh, Dispose, Sort,...
    public delegate void SomethingHappenedHandler(object pSender, object pWhat);
    public delegate void SomeValueChangedHandler(object pSender, object pWhat, object pOldValue, object pNewValue);
    public delegate void SomethingFinishedHandler(object pSender);
    public delegate void SomethingInvokedHandler();

    // EventNames = DelegateName - "Handler".
    public event SomethingHappenedHandler SomethingHappened;
    public event SomeValueChangedHandler SomeValueChanged;
    public event SomethingFinishedHandler SomethingFinished;
    public event SomethingInvokedHandler SomethingInvoked;

    // EventHandlingMethodNames = "On" + EventName.
    private void OnSomethingHappened(object pSender, object pWhat) { /* Code...*/ }
    private void OnSomeValueChanged(object pSender, object pWhat, object pOldValue, object pNewValue) { /* Code...*/ }
    private void OnSomethingFinished(object pSender) { /* Code...*/ }
    private void OnSomethingInvoked() { /* Code...*/ }

    // EventInvokingMethods = ("Fire" | "Notify" | "Invoke") + EventName.
    private void FireSomethingHappened(object pSender, object pWhat) { /* SomethingHappened?.Invoke(...); */ }
    private void NotifySomeValueChanged(object pSender, object pWhat, object pOldValue, object pNewValue) { /* SomeValueChanged?.Invoke(...); */ }
    private void InvokeSomethingFinished(object pSender) { /* SomethingFinished?.Invoke(...); */ }
    private void NotifySomethingInvoked() { /* SomethingInvoked?.Invoke(...); */ }
}

Для других элементов программы на C# я использую (вы можете) использовать следующие необязательные правила:

  1. Всегда используйте тот же регистр символов (UpperCamelCase или lowerCamelCase) вашего языка!
  2. Всегда следуйте соглашениям/правилам именования вашего языка программирования! (смотрите / анализируйте / копируйте наименования во фреймворках!)
  3. Я использую префиксы для именования, если и только если имя не нарушает правила 0 и 1,
  • например: p + ParameterName (для лучшего распознавания между локальными переменными и параметрами
  • или: m + MemberVariableName (для лучшего распознавания между локальными переменными и переменными-членами.
  • или: I + InterfaceName (например: IDeserialize, IXmlConvert, ...)
  • или: A + AbstracClassName (например: ADeserializer, AXmlConvert, ...)
  • или: E + EnumerationName (например: EState, EErrorCode, EMemberType, ...)
  • или: S + StaticVarialeNames
  • and: ALL_UPPER_CASE for:
    • compiletime constants "public const double MY_CONST = -1.23;"
    • константы времени выполнения: public static readonly MyClass MY_CLASS = new MyClass () ...)
person Pedram GANJEH HADIDI    schedule 22.02.2021