私はC#に関する本を読んでいますが、複合割り当てについて次のように述べています(たとえば、+ =、-=、* =、/ =、<< =、>> =):
このルールの微妙な例外は、第4章で説明するイベントの場合です。ここでの+ =および-=演算子は特別に扱われ、イベントの追加および削除されたアクセサーにマップされます。
誰もがそれが何を意味するのかを平易な英語で説明できますか?私はまだ第4章に行きません。
私はC#に関する本を読んでいますが、複合割り当てについて次のように述べています(たとえば、+ =、-=、* =、/ =、<< =、>> =):
このルールの微妙な例外は、第4章で説明するイベントの場合です。ここでの+ =および-=演算子は特別に扱われ、イベントの追加および削除されたアクセサーにマップされます。
誰もがそれが何を意味するのかを平易な英語で説明できますか?私はまだ第4章に行きません。
通常、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
これは単に、+ =が加算ではなくコントロールなどにイベントメソッドを付加していることを意味します(算術加算など)
// += 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) { ... ; }
違いを見ます?
C#には、メソッドを指すことができるデリゲートの概念があります。特別なタイプの代表者のようなイベントを考えることができます。イベントには多くのメソッドを使用できますadd
(または)。remove
特定のイベントが発生したときに、指定されたメソッドを実行できます。
Consoleと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());
}