我檢測到C#的功能,可以像使用事件一樣使用Action或Func。我的意思是,我可以做以下事情:使用Action或Func類似事件 - 不好的做法?
Action aAction;
aAction = DoSomething;
aAction += DoAnotherting;
// execute the action -> both functions will be executed
aAction();
aAction -= DoSomething; // unsubscribe on function
我沒有意識到這一點,認爲使用+ =只能用於事件。在第一時間,這看起來相當不錯,因爲我不必使用event關鍵字,我也可以從所有者類以外調用此操作(事件不可能)。 但是我想知道,這樣的使用有沒有很好的例子,還是隻是不好的做法?
一個完整的示例如下所示:
[TestMethod]
public void DummyTest()
{
DummyClass myInstance = new DummyClass();
int i = 0;
Action action1 =() => i++;
Action action2 =() => i += 2;
Func<int> func1 =() => 5;
myInstance.MyFunc +=() => 3;
myInstance.MyFunc += func1;
Assert.AreEqual(5, myInstance.MyFunc?.Invoke());
myInstance.MyFunc -= func1;
Assert.AreEqual(3, myInstance.MyFunc?.Invoke());
myInstance.MyAction = action1;
myInstance.MyAction += action2;
myInstance.MyAction?.Invoke();
Assert.AreEqual(3, i);
myInstance.MyAction -= action1;
myInstance.MyAction?.Invoke();
Assert.AreEqual(5, i);
myInstance.MyAction =() => i = 0;
myInstance.MyAction?.Invoke();
Assert.AreEqual(0, i);
}
class DummyClass
{
public Action MyAction;
public Func<int> MyFunc;
}
不是。看看這裏:[行動](http://stackoverflow.com/questions/7408744/is-it-bad-practice-to-use-action-and-func-all-the-time-instead-of-making-corresp ) –
我想引用NodaTime格式器。我已經在這裏提取摘錄:https://gist.github.com/Feanathiel/38fbcace35bc3f4f2d48(基於https://github.com/nodatime/nodatime/blob/69a2cdad9cb4c32a82620eae4f2460ff9479570a/src/NodaTime/Text/Patterns/SteppedPatternBuilder。 CS) – Caramiriel
這個問題可能更適合http://programmers.stackexchange.com/ – AlexFoxGill