【发布时间】:2015-07-29 16:37:19
【问题描述】:
我看到很多使用=> 语法的 C# 代码示例。
谁能解释一下这个语法的用法?
select x => x.ID
【问题讨论】:
标签: c#
我看到很多使用=> 语法的 C# 代码示例。
谁能解释一下这个语法的用法?
select x => x.ID
【问题讨论】:
标签: c#
谁能解释一下 => 语法的用法?
“胖箭头”语法用于在 C# 中形成称为 Lambda Expression 的东西。它只是代表创建的语法糖。
您提供的表达式没有任何意义,但您可以看到它在 LINQ 中被大量使用:
var strings = new[] { "hello", "world" };
strings.Where(x => x.Contains("h"));
语法x => x.Contains("h") 将被编译器推断为Func<string, bool>,它将在编译时生成。
编辑:
如果你真的想看看“幕后”发生了什么,你可以看看任何 .NET 反编译器中的反编译代码:
[CompilerGenerated]
private static Func<string, bool> CS$<>9__CachedAnonymousMethodDelegate1;
private static void Main(string[] args)
{
string[] strings = new string[]
{
"hello",
"world"
};
IEnumerable<string> arg_3A_0 = strings;
if (Program.CS$<>9__CachedAnonymousMethodDelegate1 == null)
{
Program.CS$<>9__CachedAnonymousMethodDelegate1 = new Func<string, bool>
(Program.<Main>b__0);
}
arg_3A_0.Where(Program.CS$<>9__CachedAnonymousMethodDelegate1);
}
[CompilerGenerated]
private static bool <Main>b__0(string x)
{
return x.Contains("h");
}
您可以在此处看到,编译器创建了一个名为Program.CS$<>9__CachedAnonymousMethodDelegate1 的Func<string, bool> 类型的缓存委托和一个名为<Main>b__0 的命名方法,它们被传递给Where 子句。
【讨论】:
此语法由 lambda 表达式使用 - https://msdn.microsoft.com/en-us/library/bb397687.aspx
delegate int del(int i);
static void Main(string[] args)
{
var myDelegateLambda = x => x * x; // lambda expression
Func<int, int> myDelegateMethod = noLambda; // same as mydelegate, but without lambda expression
int j = myDelegateLambda(5); //j = 25
}
private int noLambda(int x)
{
return x * x;
}
如您所见,lambda 表达式对于传达简单的委托非常有用。
【讨论】:
【讨论】: