这个引起我的思考:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
所以看了一下,this是C#3.0新特性之扩展方法。
Func<T, TResult> 委托,
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法
public delegate TResult Func<in T, out TResult>(
T arg
)
源文档 <http://msdn.microsoft.com/zh-cn/library/bb549151.aspx>
于是我就看了看C#3.0的新特性
Var I = 1;
Var intArray = new []{1,2,3,4};
C# 3.0使得你可以灵活的创建一个类的实例,而无需先写这个类的代码。所以你可以这样写代码:
new {hair="black", skin="green", teethCount=64}
扩展方法使你能够使用额外的静态方法来扩展各种类型。不过它们是非常有限的,也只能在实例方法不足够的情况下才作为候补使用。
扩展方法只能在静态类中被声明,并且以关键字"this"放在方法的第一个参数前来标识,如下就是一个有效的扩展方法的例子:
public static int ToInt32(this string s)
{
return Convert.ToInt32(s) ;
}
C# 3.0被希望来允许你包含一个初始化符,从而指定一个新创建的对象或者collection的初始值。这使得你能够一步结合声明和初始化。
Listanimals = new List{"monkey", "donkey", "cow", "dog", "cat" } ;
C# 1.X允许你在方法里写代码段,你可以轻松的使用委托(delegate)来调用。委托无疑是有用的,并且可以在框架里任意使用,但是在很多实例里你必须为了使用它而声明一个方法或者一个类。因此,为了给你一个更加容易和简洁的编码方式,C# 2.0允许你使用匿名方法替换标准调用到委托。如下代码可以在.NET1.1或者更早的版本看到:
class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = new DemoDelegate(SayHi);
myDelegate();
}
void SayHi()
{
Console.Writeline("Hiya!!") ;
}
}
在C# 2.0,使用匿名方法,你必须这样重写代码:
class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = delegate()
{
Console.Writeline("Hiya!!");
};
myDelegate();
}
}
尽管匿名方法对基于方法的委托调用更进了一步,但是Lambda表达式允许你用更加简洁,功能性的格式写匿名方法。
你可以将Lambda表达式作为一个参数列表来编写代码,跟在=>后面,再跟上一个表达式或者语句。以上的代码可以用如下的代码替换:
class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = () =>Console.WriteLine("Hiya!!") ;
myDelegate();
}
}
尽管Lambda表达式显得更加简洁,实际上他们也是一个匿名方法的功能性超集。特别的,Lambda表达式提供了如下的额外的功能:
·它们允许参数类型是被推断的。匿名方法要求你必须清楚的陈述每个类型的状态。
·它们可以支持查询表达式或C#语句。
·它们可以被看作使用表达式树的数据。这是不能用匿名方法来做的。
coords.where(c =>c.x == 1)
C# 3.0包含了一个新类型,允许表达式能够当作运行时的数据使用。这个类型,System.Expressions.Expression,只是一个内存中一个lambda表达式的重新表达。结果是你的代码可以在运行时修改和检查Lambda表达式。
如下是一个表达式树的例子:
Expressionfilter = () =>Console.WriteLine("Hiya!!") ;
使用如上的表达式树的方法,你可以使用过滤器变量中的各种属性来检查树的内容