-3

我正在读一本关于 C# 的书,其中有关于复合赋值的内容(例如 +=、-=、*=、/=、<<=、>>=):

这个规则的一个微妙的例外是事件,我们将在第 4 章中描述:这里的 += 和 -= 运算符被特殊处理并映射到事件的添加和删除访问器。

谁能用简单的英语解释一下这意味着什么?我还没到第四章。

4

3 回答 3

6

通常 a+=会将右侧的表达式/变量添加到左侧的表达式/变量,并将结果分配给左侧。

// if a = 4, after this statement, a would be 5
a += 1;

但是,如果带有 a 的表达式的左侧+=是一个事件,则情况并非如此,而是右侧的事件处理程序,它被添加到该事件的事件处理程序列表中。

// whereas on the below statement someEventHandler is added to the collection of event handlers for the 'OnSomeEvent' event
self.OnSomeEvent += someEventHandler
于 2013-02-05T06:06:39.480 回答
3

它只是意味着 += 将事件方法附加到例如控件而不是加法(例如算术加法)

// += as in arithmetic addition
int i = 3;
i += 1;  // i now outputs 4

// += as in programmatically attaching an event to a control 
Button btn = new Button();
btn.Click += new EventHandler(btn_Click); 

private void btn_Click(object obj) { ... ; }

看到不同?

于 2013-02-05T06:06:32.847 回答
1

C# 中有一个委托的概念,它可以指向一个方法。您可以将事件视为一种特殊类型的委托。您可以add(或remove)许多方法来处理一个事件。它允许您在发生特定事件时执行指定的方法。

一个简单的示例,当您删除在控制台和 MessageBox 上都显示删除结果的文件时。

// This is the delegate. Any instance with DeletedEventHandler type 
// can point a method which returns voids and accepts parameters (object,bool)
public delegate void DeletedEventHandler(object sender, bool deleted);

public class FileDeleter
{   
     private DeletedEventHandler onDelete;

     public event DeletedEventHandler OnDelete
     {
         // The add and remove accessors
         add { onDelete += value; }
         remove { onDelete -= value; }
     }

     public void Delete(string filePath)
     {
         try
         {
             File.Delete(filePath);
             RaiseOnDelete(true);
         }
         catch
         {
             RaiseOnDelete(false);
         }
     }

     private void RaiseOnDelete(bool deleted) 
     {
         if (onDelete != null)
             onDelete(this, deleted); // all methods added executes here
     }
}


public void TestMethod()
{
    FileDeleter deleter = new FileDeleter();
    // Note that both ShowDeleteInfoWindows and ShowDeleteInfoConsole are in form of void(object,bool) which is compatible with DeletedEventHandler 
    deleter.OnDelete += new DeletedEventHandler(DeletedOnConsole);
    deleter.OnDelete += new DeletedEventHandler(ShowDeleteInfoWindows);
    deleter.Delete(@"C:\test.txt");
}

private void ShowDeleteInfoConsole(object deleter, bool isDeleted)
{
    Console.WriteLine(isDeleted);
}

private void ShowDeleteInfoWindows(object deleter, bool isDeleted)
{
    MessageBox.Show(isDeleted.ToString());
}
于 2013-02-05T06:19:07.620 回答