If I have the below code, should I just call the Action or should it call Action.Invoke?
public class ClassA { public event Action<string> OnAdd; private void SomethingHappened() { if (OnAdd != null) OnAdd("It Happened"); //Should it be OnAdd.Invoke("It Happened") ??????? } } public class ClassB { public ClassB() { var myClass = new ClassA(); myClass.OnAdd += Add; } private void Add(string Input) { //do something } }
The two are equivalent, the compiler converts OnAdd("It Happened");
into OnAdd.Invoke("It Happened");
for you.
I guess it's a matter of preference, however I personally prefer the terser form.
As an aside, it is generally preferable to take a local copy of a class level delegate before invoking it to avoid a race condition whereby OnAdd
is not null at the time that it is checked, but is at the time that it is invoked:
private void SomethingHappened() { Action<string> local = OnAdd; if (local != null) { local("It Happened"); } }
Something I noticed on this with the latest C# 6 release as it may encourage Invoke
to be used more and thought I'd add it to this old question in case it helps someone:
"Old" way:
Action<string> doSomething = null; // or not null if (doSomething != null) doSomething("test");
Possible pragmatic way (similar to empty event delegate pattern):
Action<string> doSomethingPragmatic = s => { }; // empty - might be overwritten later doSomethingPragmatic("test");
C# 6:
Action<string> doSomethingCs6 = null; // or not null doSomethingCs6?.Invoke("test"); // Not valid C#: // doSomethingCs6?("test") // doSomethingCs6?.("test")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With