坚持试图了解代表

时间:2014-12-17 07:18:26

标签: c#

book是一个对象,Namechanged是delegate类型的字段,OnNameChange是委托可以指向的方法; OnNameChange只是写入控制台窗口

使用此代码:

        book.NameChanged = OnNameChange;
        book.NameChanged += OnNameChange;

两个实例打印到屏幕上。

但是使用此代码:

        book.NameChanged += OnNameChange;
        book.NameChanged = OnNameChange;

只有一个实例打印到screen.Same行为,如下代码:

        book.NameChanged = OnNameChange;
        book.NameChanged = OnNameChange;

有人请赐教C#代表的基本知识。当我试图打破并进入代码本身时,我仍然是初学者并迷失方向。我向自己解释行为的微弱尝试是,如果你开始一个多演员代表,那么成功的演员也应该是多播的。

非常感谢任何帮助我掌握这个概念的输出:D

2 个答案:

答案 0 :(得分:5)

假设你有

const int oneBook = 1;
int bookCounter = 0;

您的第一个代码块相当于:

// bookCounter == 0
bookCounter = oneBook;
// bookCounter == 1
bookCounter += oneBook;
// bookCounter == 2

您的第二个代码块相当于:

// bookCounter == 0
bookCounter += oneBook;
// bookCounter == 1
bookCounter = oneBook;
// bookCounter == 1

委托的行为非常相似,但是使用执行代码的函数而不是递增的数字。

答案 1 :(得分:2)

基本上+ =语法解析为:

book.NameChanged = book.NameChanged + OnNameChange; 

委托类型会覆盖+运算符,创建一个链接方法调用的MulticastDelegate。代理确实支持添加和减去作为从调用列表添加/减去函数的操作。 (正如评论中所提到的,+并没有真正向调用列表添加函数,而是为结果创建了新的多播委托)。

如果要抑制=运算符,请创建一个事件。

public event EventHandler NameChanged;

现在=运算符在定义类之外无效。