2012-02-13 44 views
4

可以说我有下面的代码。直接分配行为和订阅事件有什么区别?分配动作之间的区别<T>方法和订阅动作<T>事件

//Action directly assigned 
public class ClassA 
{ 
    public Action<string> OnAdd; 

    private void SomethingHappened() 
    { 
    OnAdd("It Happened"); 
    } 
} 

public class ClassB 
{ 

    public ClassB() 
    { 
    var myClass = new ClassA(); 
    myClass.OnAdd = Add; 
    } 

    private void Add(string Input) 
    { 
    //do something 
    } 
} 

//Event handlers 
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 
    } 
} 
+0

通常情况下,您将使用EventArgs 创建事件,而不是使用Action。 – 2012-02-13 10:35:06

+0

@SoMoS即使它只是一个字符串或int越过? – Jon 2012-02-13 10:39:06

+0

@jon此行'myClass.Add = myClass.OnAdd;'无效......'.Add'反驳什么? – 2012-02-13 10:56:04

回答

10

(顺便说一句,这是很难,当你使用了相同的类型名称两次来解释的东西。)

当你使用一个公共领域,客户不仅可以订阅事件 - 他们可以

myClass.OnAdd = Add; 

它们也直接调用处理程序:也完全被分配,而不是添加删除其他事件处理程序

myClass.OnAdd("foo"); 

这两个都违反了正常的pub/sub模式,其中各个用户彼此隔离。订阅者不会覆盖彼此的订阅(只能添加或删除他们自己的订阅),他们不会自行提高事件。

有关活动和代表的更多信息,请参阅my article on the topic

+0

从你的书中读取 - 这个事件就像是代理链的属性(getter setter),它就像另一个不允许用户做'='的保护级别(ps你昨天发给我的torrent是50GB !!: ))但它的价值...... :) – 2012-02-13 10:38:15

+0

@RoyiNamir:是的,非常。它不是get/set,而是添加/删除。 – 2012-02-13 10:39:19

+0

@JonSkeet感谢您的答案,使用相同的名称说明了问题的重点 - 两件事物之间的区别是什么,看起来非常相似 – Jon 2012-02-13 10:41:38

2

您可以将多个代表分配给一个事件(因此+=运算符)。

+1

如果你只是有一个委托字段,你也可以创建复合事件......关键是你可以添加一个处理器,而不是覆盖现有的事件。 – 2012-02-13 10:38:41

0

一个事件的行为像一个委托人的包装,以防止重新指派/删除,正如约翰指出的那样。我发现this相当不错的阅读。

相关问题