【问题标题】:C# Compound Assignment (e.g. +=, -=, etc.) "Exceptions" [closed]C# 复合赋值(例如 +=、-= 等)“例外”[关闭]
【发布时间】:2013-01-20 00:02:20
【问题描述】:

我正在阅读一本关于 C# 的书,其中提到了复合赋值(例如 +=、-=、*=、/=、>=):

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

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

【问题讨论】:

  • 这就是它所说的。对于event,这些运算符的作用很特殊——它们分别调用addremove 方法。
  • 您可以随时跳到第 4 章,看一眼,然后返回到您离开的地方。 编辑: 等一下,它说“我们在第 4 章中描述过”,用过去时。这不是暗示你在稍后章节吗?您是否跳过了过去第 4 章,还是这本书的时态混淆了? ಠ_ಠ
  • @pst 正在发生的“事件”是什么?
  • 好的,我现在输入我的 -1。请阅读提供的链接。我不是为了我的缘故而添加它们。
  • @Michael:啊,这就解释了。也就是说,只要这本书不费心在上下文中向我解释新概念,和/或它指向相关章节,我就会按照我在评论中所说的去做。编程书籍是您不必从头到尾阅读的那种——您可以随时在章节之间跳转:)

标签: c# events compound-assignment


【解决方案1】:

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

// 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

【讨论】:

  • 哦,好的。 :) 当 LHS 是一个事件时,它是一个重载的运算符,它具有新的含义。知道了。谢谢! :)
【解决方案2】:

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

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

看到区别了吗?

【讨论】:

    【解决方案3】:

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

    一个简单的例子,当你删除一个在控制台和消息框上都显示删除结果的文件时。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 2011-01-26
      • 1970-01-01
      • 2012-10-02
      • 2012-08-04
      • 2021-04-22
      • 2021-04-24
      • 1970-01-01
      相关资源
      最近更新 更多