Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#复合赋值(例如+;=,-=,等等)“;“例外情况”;_C#_Events_Compound Assignment - Fatal编程技术网

C#复合赋值(例如+;=,-=,等等)“;“例外情况”;

C#复合赋值(例如+;=,-=,等等)“;“例外情况”;,c#,events,compound-assignment,C#,Events,Compound Assignment,我正在读一本关于C#的书,它是关于复合赋值的(例如+=,-=,*=,/=,=): 这个规则的一个微妙的例外是事件,我们在第4章中描述了这一点:这里的+=和-=操作符被特别处理,并映射到事件的add和removed访问器 有人能用通俗易懂的英语解释一下这意味着什么吗?我还没讲到第4章。它只是意味着+=将事件方法附加到例如控件上,而不是加法(例如算术加法) 看到差异了吗?通常,+=会将右侧的表达式/变量添加到左侧的表达式/变量,并将结果分配到左侧 // if a = 4, after this st

我正在读一本关于C#的书,它是关于复合赋值的(例如+=,-=,*=,/=,=):

这个规则的一个微妙的例外是事件,我们在第4章中描述了这一点:这里的+=和-=操作符被特别处理,并映射到事件的add和removed访问器


有人能用通俗易懂的英语解释一下这意味着什么吗?我还没讲到第4章。

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


看到差异了吗?

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

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

C#中有委托的概念,它可以指向一个方法。您可以将事件想象为一种特殊类型的代理。您可以
向事件添加
(或
删除
)许多方法。它允许您在特定事件发生时执行指定的方法

一个简单的示例,当您删除一个文件时,该文件在控制台和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());
}

这就是它所说的。例如,这些操作符的行为很特殊-它们分别调用
add
remove
方法。您可以随时跳到第4章,看一眼,然后返回到您停止的地方。编辑:等一下,上面写着“我们在第四章中描述的”,用过去时态。这不意味着你在后面的章节吗?你是跳过了第四章,还是这本书的时态弄混了?ಠ_ಠ@正在发生的“事件”是什么?好的,我现在投我的-1。请阅读提供的链接。迈克尔:啊,这就解释了。这就是说,只要这本书没有在上下文中向我解释新概念,或者它指向相关章节,我就会按照我在评论中所说的去做。编程书籍是一种你不必从头到尾阅读的书籍——你可以随时在章节之间跳跃:)哦,好的。:)当LHS是一个事件时,它是一个重载运算符,具有新的含义。知道了。谢谢!:)
// 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());
}