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
答案 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;
现在=运算符在定义类之外无效。