C# 一直在试图理解代理

C# 一直在试图理解代理,c#,C#,book是一个对象,Namechanged是委托类型的字段,OnNameChange是委托可以指向的方法;OnNameChange只会写入控制台窗口 使用此代码: book.NameChanged = OnNameChange; book.NameChanged += OnNameChange; 两个实例打印到屏幕上 但是,对于此代码: book.NameChanged += OnNameChange; book.NameChan

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

使用此代码:

        book.NameChanged = OnNameChange;
        book.NameChanged += OnNameChange;
两个实例打印到屏幕上

但是,对于此代码:

        book.NameChanged += OnNameChange;
        book.NameChanged = OnNameChange;
        book.NameChanged = OnNameChange;
        book.NameChanged = OnNameChange;
只有一个实例打印到屏幕上。行为与此代码相同:

        book.NameChanged += OnNameChange;
        book.NameChanged = OnNameChange;
        book.NameChanged = OnNameChange;
        book.NameChanged = OnNameChange;
有人请告诉我C#中代表的基本知识。我仍然是一个初学者,当我尝试突破并进入代码本身时会迷失方向。我试图向自己解释这种行为的不足之处在于,如果启动一个多重强制转换委托,则后续的强制转换也应该是多重强制转换


帮助我理解这个概念的任何输出都是非常值得赞赏的:D

基本上+=语法是这样解决的:

book.NameChanged = book.NameChanged + OnNameChange; 
委托类型重写+运算符,创建链接方法调用的多播委托。委托确实支持添加和减法as操作,以从调用列表中添加/减法函数。(如注释中所述,+并没有真正将函数添加到调用列表中,而是为结果创建了一个新的多播委托)

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

public event EventHandler NameChanged;
现在,=运算符在定义类之外无效。

假设您有

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
您的第二个代码块相当于:

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

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

委托通常指a(也就是说方法遵循定义的方法签名,即arg类型和返回类型).
+=
也会创建新的委托,因为委托是不可变的。答案可能过于简单,但我认为这是理解发生了什么的好方法。@Kobi我实际上非常喜欢过于简单的示例。谢谢你