バックグラウンド
MSDNデリゲートチュートリアル(C#)から作業すると、次のようになります。
デリゲートが作成されると、関連付けられているメソッドは変更されないことに注意してください。デリゲートオブジェクトは不変です。
そして、コードサンプルでこれを確認します(コード全体を少し広げます)。
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
質問
ここで明らかに、ここでのコードの記述方法により、プロセスごとに新しいデリゲートが作成されます。私は推測あなたのようなものを行うためにしようと不変性が関連しています
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
thisIsATest
不変であるときにどれをコンパイルする必要がありますか?では、Microsoftを不変にすることでどのような問題を解決したのでしょうか。C#6がデリゲートを変更可能にした場合、どのような問題が発生しますか?
編集
私は不変性がこれを防ぐと信じています:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
しかし、不変性はこれを防止しません:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
この理解は正しいですか?
Func<int>
、最初に1を返すことは完全に正当です。呼び出された時間、2秒など-これは本質的に可変オブジェクトのように動作します。