2013-02-05 35 views
-3

我正在阅读一本关于C#的书,它有关于复合赋值的说法(例如+ =, - =,* =,/ =,< < =,>> =):C#复合分配(例如+ =, - =等)“例外”

一个微妙的例外是与事件,我们将在第4章描述:+ =和 - =这里运营商都经过特殊处理,并映射到该事件的添加和删​​除访问器。

任何人都可以解释什么是纯英文的含义吗?我还没有到第4章。

+0

这就是它说的。对于['event'](http://msdn.microsoft.com/en-us/library/8627sbea(v = vs.110).aspx),这些操作符的行为是特殊的 - 他们称之为“add”和“remove”方法,分别。 – 2013-02-05 06:04:19

+3

你总是可以跳到第4章,偷看,然后返回到你离开的地方。 *编辑:*等一会儿,它说“我们在第4章中讲过”,用过去式。这并不意味着你在*后面的章节?你是否跳过*第4章,或者书中的时态混淆了? ಠ_ಠ – BoltClock

+0

@pst什么是正在发生的“事件”? – TimFoolery

回答

6

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

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

但万一表达与+=左手边是一个事件,那么这是不是这样的,但它会在右侧的事件处理程序,它被添加到列表该事件的事件处理程序。

// whereas on the below statement someEventHandler is added to the collection of event handlers for the 'OnSomeEvent' event 
self.OnSomeEvent += someEventHandler 
+0

哦,好的。 :)这是一个重载操作符,当LHS是一个事件时,它具有新的含义。得到它了。谢谢! :) – TimFoolery

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) { ... ; } 

看到区别?

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()); 
}