`
cloudtech
  • 浏览: 4605519 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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"放在方法的第一个参数前来标识,如下就是一个有效的扩展方法的例子:

    publicstaticintToInt32(thisstrings)

    {

    returnConvert.ToInt32(s);

    }

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

    Listanimals=newList{"monkey","donkey","cow","dog","cat"};

  12. Visual C# 3.0新特性:Lambda表达式:匿名方法的浓咖啡
  13. C# 1.X允许你在方法里写代码段,你可以轻松的使用委托(delegate)来调用。委托无疑是有用的,并且可以在框架里任意使用,但是在很多实例里你必须为了使用它而声明一个方法或者一个类。因此,为了给你一个更加容易和简洁的编码方式,C# 2.0允许你使用匿名方法替换标准调用到委托。如下代码可以在.NET1.1或者更早的版本看到:

    classProgram

    {

    delegatevoidDemoDelegate();

    staticvoidMain(string[]args)

    {

    DemoDelegatemyDelegate=newDemoDelegate(SayHi);

    myDelegate();

    }

    voidSayHi()

    {

    Console.Writeline("Hiya!!");

    }

    }

    在C# 2.0,使用匿名方法,你必须这样重写代码:

    classProgram

    {

    delegatevoidDemoDelegate();

    staticvoidMain(string[]args)

    {

    DemoDelegatemyDelegate=delegate()

    {

    Console.Writeline("Hiya!!");

    };

    myDelegate();

    }

    }

    尽管匿名方法对基于方法的委托调用更进了一步,但是Lambda表达式允许你用更加简洁,功能性的格式写匿名方法。

    你可以将Lambda表达式作为一个参数列表来编写代码,跟在=>后面,再跟上一个表达式或者语句。以上的代码可以用如下的代码替换:

    classProgram

    {

    delegatevoidDemoDelegate();

    staticvoidMain(string[]args)

    {

    DemoDelegatemyDelegate=()=>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!!");

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics