ラムダ式とは_=> expr
どういう意味ですか?
_
ラムダへの入力としての目的は何ですか?
例:
int count = 0;
list.ForEach(_ => count += 1);
list
するとIEnumerable<T>
、彼らは使用した可能性がある(そして使用する必要があった)sum = list.Count();
ラムダ式とは_=> expr
どういう意味ですか?
_
ラムダへの入力としての目的は何ですか?
例:
int count = 0;
list.ForEach(_ => count += 1);
list
するとIEnumerable<T>
、彼らは使用した可能性がある(そして使用する必要があった)sum = list.Count();
回答:
これは、パラメータを気にしないときに使用される規則です。
_
パターンマッチングのワイルドカード文字です。それは基本的には「私は気にしない、これを常に一致させたい」という意味です。この「気にしない」は、気にしないものに名前を付けるときに持ち越され、そこから他のプログラミング言語に波及します。たとえば、Rubyでは_
特別な意味はまったくありませんが、Ruby ではこの例と同じ意味で使用されます。
これはパラメーター名ですが、有用な名前ではありませんが、コードをコンパイルするために式にパラメーターがあることを指定する必要があるが、実際には気にしない場合に(一部の規則によって)通常使用される名前ですそれについて、あなたはそれを無視するつもりです。
これは基本的に、C#の正当な識別子が構成する構文を利用しており、識別子はアンダースコアで始まり、他に何も含まないため、単なるパラメーター名です。
あなたは簡単に書くことができたでしょう:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_
有効な変数名です。_
変数として使用しています。
また_ => _.method()
、1行のメソッド呼び出しラムダを使用することで、命令の認知的重みが軽減されます。特にジェネリックスを使用する場合x => x.method()
、「この「x」は何ですか?空間の座標ですか?」という一瞬の考慮を追加するだけです。
次のケースを考えてみましょう:
Initialize<Client> ( _=>_.Init() );
Generics呼び出しで使用すると、この場合のアンダースコアは「バイパス記号」として機能します。これは冗長性を回避し、引数の型が明白であり、使用から推測できることを定義します-型宣言の繰り返しを防ぐために 'var'を使用する場合と同じです。client=>client.Init()
ここに書いても、意味が追加されることなく、命令が長くなるだけです。
明らかに、これはメソッドに渡されるパラメーターには適用されません。例えば。:Do( id=>Log(id) );
ラムダ識別子がジェネリック定義から切り離されるため、ワンライナーではなくコードのブロックを使用する場合、メソッド呼び出しの単一アンダースコアパラメータの使用はほとんど正当化できません。一般に、同じ識別子を再利用する場合は、わかりやすい名前を付けてください。
要するに、冗長性は曖昧性解消、特に匿名デリゲートの作成を単純化するために最初に作成されたラムダに対してのみ正当化できるということです。いずれの場合も、読みやすさと簡潔さのバランスを取りながら、常識を使用する必要があります。シンボルが実際の機能への「フック」にすぎない場合は、1文字の識別子で十分です。これは、Forループと、インデクサーとしての "i"および "j"文字の場合に当てはまります。
Do(id => Log(id))
はと省略しDo(Log)
た方が適切です。