2016-04-04 3 views
2

代理人は不変オブジェクトです。代理人不変性と代入演算子

私がスレッドにしている場合:別のスレッドが例外を上げることはできませんhandlerからデリゲートを排除した場合、私はcopy(...) を呼び出すときに、スレッドの安全性の操作でコピー

EventHandler handler = (s, e) => Console.WriteLine("..."); 
EventHandler copy = handler; 
copy(new object(), EventArgs.Empty); 

しかし、私が行った場合、すなわち,:

handler.GetHashCode()copy.GetHashCode()どちらも同じコードを返します。彼らは両方の参照場合

私は

...代入演算子は、そのデリゲート の新しいインスタンスを行なったし、新しい参照がcopy変数に入れていたということを考えてどのように、このように、copyhandlerは独立することができ メモリ内の同じオブジェクトですか?

混乱しています!

+0

実際の質問は、 "等しいハッシュコードは両方の変数が同じインスタンスを参照していることを意味します" _、その答えは "いいえ"です。 – CodeCaster

+2

@CodeCasterただし、この場合、両方の変数が同じオブジェクトを参照します。 – juharr

+1

変更不可能とは、オブジェクトを変更できないことを意味します。しかし、新しいオブジェクトを 'handler'に代入することも(あるいはnullに設定することもできます)、その変更は' copy'には影響しません。 – juharr

答えて

2

私はありません

...代入演算子は、そのデリゲートの新しいインスタンスを行なったし、新しい参照がコピー変数に入れていたということを考えて、それが新しいインスタンスを作成しません。 別のスレッドがイベントの登録されたデリゲートを変更した場合、現在のインスタンスは同じままです。イベントハンドラは不変なので、イベントハンドラの代入によって新しいオブジェクトが生成されます。

文字列も変更できませんが、文字列を別の文字列に割り当てるとコピーされません。新しいインスタンスを作成します。

+0

そのコピーの後にスレッドが ' - ='演算子を持つ参照デリゲートを 'handler'で削除すると、引数として渡されたデリゲートを含まない新しい' Delegate'を作成する 'Remove'メソッドを実際に使用しています。したがって、 'copy'が同じデリゲートを指している場合でも、メソッドはまだそこにあります... – xdevel2000

+0

はい、そうです。 @ xdevel2000 –