Just in case someone else/new to C# needs more concrete explanation/examples:
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(...); */ }
}
For other program elements in C#, I use (you can) use following optional rules:
- Use always same character-casing (UpperCamelCase or lowerCamelCase) of your language!
- Always follow the naming-conventions/-rules of your programming language! (see/analyze/copy namings in frameworks!)
- I use prefixes for naming, if and only if the name is not violating against rule 0 and 1,
- like: "p" + ParameterName (for better recognition between local variables and parameters
- or: "m" + MemberVariableName (for better recognition between local and member variables.
- or: "I" + InterfaceName (like: IDeserialize, IXmlConvert,...)
- or: "A" + AbstracClassName (like: ADeserializer, AXmlConvert,...)
- or: "E" + EnumerationName (like: EState, EErrorCode, EMemberType,...)
- or: "S" + StaticVarialeNames
- and: ALL_UPPER_CASE for:
- compiletime constants "public const double MY_CONST = -1.23;"
- runtime constants: "public static readonly MyClass MY_CLASS = new MyClass()...")