lambda表达式_=> expr
是什么意思?
_
输入lambda 的目的是什么?
例:
int count = 0;
list.ForEach(_ => count += 1);
list
是an IEnumerable<T>
,他们可以(并且应该)刚刚使用过sum = list.Count();
lambda表达式_=> expr
是什么意思?
_
输入lambda 的目的是什么?
例:
int count = 0;
list.ForEach(_ => count += 1);
list
是an IEnumerable<T>
,他们可以(并且应该)刚刚使用过sum = list.Count();
Answers:
这是当您不关心参数时使用的约定。
_
是模式匹配中的通配符。它的基本含义是“我不在乎,我一直希望它与之匹配”。然后,在命名您不关心的事物时,这种“我不在乎”就会被保留下来,并扩散到其他编程语言中。例如,即使_
在Ruby中绝对没有特殊意义,它在Ruby中也用于表示与本示例相同的含义。
它是一个参数名称,尽管它不是一个有用的名称,但是当需要指定表达式具有参数以便编译代码时,它通常(根据某些约定)使用该名称,但是您并不在乎关于它,所以您将忽略它。
它基本上是在利用C#中的合法标识符构成的语法,并且由于标识符可以以下划线开头,并且不包含其他任何内容,因此它只是一个参数名称。
您可以轻松地编写以下内容:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_
是有效的变量名称。它们只是_
用作变量。
我还第二次使用了_ => _.method()
单行方法调用lambda,因为它减少了指令的认知分量。特别是在使用泛型时,编写时x => x.method()
只是添加了“这是什么'x'?它是空间坐标吗?”的瞬间考虑。
考虑以下情况:
Initialize<Client> ( _=>_.Init() );
与泛型调用一起使用时,下划线在这种情况下用作“旁路符号”。它避免了冗余,定义了参数的类型是显而易见的,并且可以从用法中推断出-就像您使用'var'来防止重复类型声明时一样。client=>client.Init()
在这里写只会增加指令的长度而不会增加任何意义。
显然,这不适用于要传递给方法的参数,该参数应以描述性方式命名。例如。:Do( id=>Log(id) );
当使用代码块而不是单行代码时,方法调用的单下划线参数用法几乎是不合理的,因为lambda标识符已从其泛型定义中断开。通常,当要重复使用相同的标识符时,请为其提供描述性名称。
最重要的是,冗长仅是为了消除歧义,特别是对于lambda是合理的,lambda最初是为了简化匿名代表的创建而创建的。无论如何,都应使用常识,以兼顾易读性和简洁性。如果该符号只是真正功能的“钩子”,那么一个字符标识符就可以了。对于For循环以及使用“ i”和“ j”字母作为索引器的情况就是这样。
Do(id => Log(id))
最好缩写为Do(Log)
。