C# 3.0 新特性

    这个引起我的思考:

    public static IEnumerable<TSource> Where<TSource>(
            
    this IEnumerable<TSource> source,
            Func<TSource,
    bool> predicate
    )

  1. 这个this 参数怎样去解释?
  2. Func<TSource, bool>这个怎样解释?
  3. 所以看了一下,thisC#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的新特性

  4. Visual C# 3.0新特性:隐式类型本地变量
  5. Var I  = 1;

    Var intArray = new []{1,2,3,4};

  6. Visual C# 3.0新特性:匿名变量
  7. C# 3.0使得你可以灵活的创建一个类的实例,而无需先写这个类的代码。所以你可以这样写代码:

    new {hair="black", skin="green", teethCount=64} 

  8. Visual C# 3.0新特性:扩展方法
  9. 扩展方法使你能够使用额外的静态方法来扩展各种类型。不过它们是非常有限的,也只能在实例方法不足够的情况下才作为候补使用。

    扩展方法只能在静态类中被声明,并且以关键字"this"放在方法的第一个参数前来标识,如下就是一个有效的扩展方法的例子:

    public static int ToInt32(this string s)  

    {  

    return Convert.ToInt32(s) ;  

    }

  10. Visual C# 3.0新特性:对象和Collection初始化符
  11. C# 3.0被希望来允许你包含一个初始化符,从而指定一个新创建的对象或者collection的初始值。这使得你能够一步结合声明和初始化。

    Listanimals = new List{"monkey""donkey""cow""dog""cat" } ; 

  12. Visual C# 3.0新特性:Lambda表达式:匿名方法的浓咖啡
  13. 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#语句。

    ·它们可以被看作使用表达式树的数据。这是不能用匿名方法来做的。

  14. Visual C# 3.0新特性:查询表达式
  15. coords.where(c =>c.x == 1) 

  16. Visual C# 3.0新特性:表达式树
  17. C# 3.0包含了一个新类型,允许表达式能够当作运行时的数据使用。这个类型,System.Expressions.Expression,只是一个内存中一个lambda表达式的重新表达。结果是你的代码可以在运行时修改和检查Lambda表达式。

    如下是一个表达式树的例子:

    Expressionfilter = () =>Console.WriteLine("Hiya!!") ; 

    使用如上的表达式树的方法,你可以使用过滤器变量中的各种属性来检查树的内容

     

你可能感兴趣的:(新特性)