タグ付けされた質問 「anonymous-methods」

4
C#がforeachで変数を再利用する理由はありますか?
C#でラムダ式または無名メソッドを使用する場合、変更されたクロージャーの落とし穴へのアクセスに注意する必要があります。例えば: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } 変更されたクロージャのため、上記のコードではWhere、クエリのすべての句がの最終値に基づいていますs。 ここで説明したように、これsは、foreach上記のループで宣言された変数がコンパイラで次のように変換されるために発生します。 string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } このようにする代わりに: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } ここで指摘したように、ループの外側で変数を宣言してもパフォーマンス上の利点はありません。通常の状況では、これを行うために考えられる唯一の理由は、ループのスコープ外で変数を使用する場合です。 string s; while (enumerator.MoveNext()) { …

11
C#で匿名メソッドをサブスクライブ解除する
匿名メソッドをイベントから退会させることは可能ですか? 私がこのようなイベントを購読すると: void MyMethod() { Console.WriteLine("I did it!"); } MyEvent += MyMethod; 私はこのように退会することができます: MyEvent -= MyMethod; しかし、匿名メソッドを使用してサブスクライブした場合: MyEvent += delegate(){Console.WriteLine("I did it!");}; この匿名メソッドの登録を解除することは可能ですか?もしそうなら、どのように?


8
Invoke呼び出しの匿名メソッド
Control.Invoke内でデリゲートを匿名で呼び出す構文に少し問題があります。 私たちは多くの異なるアプローチを試みましたが、どれも役に立ちませんでした。 例えば: myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); ここで、someParameterはこのメソッドに対してローカルです 上記の場合、コンパイラエラーが発生します。 デリゲート型ではないため、匿名メソッドを型 'System.Delegate'に変換できません

5
C#で、無名メソッドにyieldステートメントを含めることができないのはなぜですか?
私はこのようなことをするのが良いだろうと思いました(ラムダが利回りを返すことで): public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() { IList<T> list = GetList<T>(); var fun = expression.Compile(); var items = () => { foreach (var item in list) if (fun.Invoke(item)) yield return item; // This is not allowed by C# } return items.ToList(); } しかし、無名メソッドでは利回りを使用できないことがわかりました。なぜだろう。歩留まりのドキュメントは、それが許可されていないと言います。 許可されなかったので、リストを作成して項目を追加しただけです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.