C#でデリゲートを使う
質問
C#言語と.NETフレームワークにおいて、デリゲートの理解について教えていただけないでしょうか。 私はいくつかのコードをチェックしようとしていて、私が受け取った結果が私にとって予期しないものであることがわかりました。それはここにあります。
class Program
{
public static int I = 0;
static Func<string> del = new Func<string>(I.ToString);
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del());
}
}
答えは0でしたが、10ではありませんでした。なぜですか?
どのように解決するのですか?
原因は以下の通りです。
デリゲートを宣言する方法によって、それは直接
ToString
メソッドを指します。これは作成時にキャプチャされます。
flindebergが以下のコメントで指摘しているように、各デリゲートはターゲットとターゲット上で実行されるメソッドを持っています。
この場合、実行されるメソッドは明らかに
ToString
メソッドです。興味深いのは、このメソッドが実行されるインスタンスです。のインスタンスです。
I
のインスタンスであり、これはデリゲートが
I
を使用して使用するインスタンスを取得するのではなく、インスタンス自体への参照を保存していることを意味します。
後で
I
を別の値に変更し、基本的に新しいインスタンスを代入します。この場合、デリゲートに取り込まれたインスタンスは魔法のように変化しませんが、なぜそうしなければならないのでしょうか?
期待する結果を得るには、デリゲートをこのように変更する必要があります。
static Func<string> del = new Func<string>(() => I.ToString());
このように、デリゲートは無名メソッドを指し示し、そのメソッドは
ToString
を実行します。
I
を、デリゲート実行時に指定します。
この場合、実行されるメソッドはデリゲートが宣言されているクラスで作成された無名メソッドです。静的メソッドであるため、インスタンスはnullとなります。
コンパイラが生成した2番目のバージョンのデリゲートのコードを見てください。
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
見ての通り、通常のメソッドで行う
何か
. この例では
ToString
の現在のインスタンスに対して
I
.
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] C#でメソッドをパラメータとして渡す
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] デリゲートとイベントの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。