C# 语法特性

  C# 2.0

    1、泛型(Generics)。

    2、泛型方法、泛型委托、泛型接口。

    3、泛型约束(constraints)。

    4、部分类(partial)。

    5、匿名方法。

  C#3.0/C#3.5

    1、自动属性。

    2、隐式推断类型var。  ObjectQuery<>或IQueryable<>。

      var 隐式类型的限制:

        被声明的变量必须是一个局部变量,而不是静态或实例字段。

        变量必须在声明的同时被初始化,因为编译器要根据初始化值推断类型。

        初始化的对象不能是一个匿名函数。

        初始化表达式不能是null。

        语句中只能声明一次变量,声明后不能改变类型。

        赋值的数据类型必须是可以在编译时确定的类型。

    3、对象集合初始化器。

    4、匿名类。

    5、扩展方法。

    public static class StringUtil
    {
        public static void WriteSelf(this string strSelf,int year)
        {
            Console.WriteLine("我是 {0} ,今年是 {1}。", strSelf, year);
        }
    }

       ⑴、实例方法由于扩展方法(允许存在同名实例方法和扩展方法)。

       ⑵、可以在空引用上调用扩展方法。

       ⑶、可以被继承。

       ⑷、并不是任何方法都能作为扩展方法使用,必须有以下特征:

          它必须放在一个非嵌套、非泛型的静态类中。

          它至少有一个参数。

          第一个参数必须附加this关键字。

          第一个参数不能有任何其他修饰符(out / ref)。

    6、系统内置委托    Func / Action 委托使用可变性:协变指的是委托方法的返回值类型直接或间接继承自委托签名的返回值类型,逆变则是参数类型继承自委托方法的参数类型

                           System.Func,代表有返回类型的委托。

                           注:输入泛型参数-in最多可以有16个,输出泛型参数-out 只有一个。

                           System.Action代表无返回类型的委托。

                           注:最多有16个参数。

                           System.Predicate<T>代表返回bool类型的委托,用作执行表达式。

                           System.Comparison<T>代表返回Int类型的委托,用于比较两个参数的大小。

    7、Lambda表达式

        Lambda表达式中的变量范围:

            捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。

            在外部方法中看不到Lambda表达式内引入的变量。

            Lambda表达式无法从封闭的方法中直接捕获ref或out参数。

            Lambda表达式中的返回语句不会导致封闭方法返回。

            Lambda表达式不能包含其目标位于所包含匿名函数主体外部或内部的goto语句、break语句或、continue语句。

    8、Lambda表达式缩(IEnumerable和IQueryable)写推演

            

        new Func<string,int>(delegate(string str) {return str.Length;});
        delegate (string str) {str.Length;}
        (string str) => {return str.Length;}
        (string str)=>str.Length;
        (str)=>str.Length;
        str=str.Length;

    9、标准查询运算符(SQO)

        标准查询运算符是定义在System.Linq.Enumerable 类中的50多个为IEnumerable<T> 准备的扩展方法,换句话说IEnumerable<T> 上的每个方法都是一个标准查询运算符,这些方法用来对操作的集合进行查询筛选。

        标准查询运算符提供了包括筛选、投影、聚合、排序等功能在内的查询功能。

          

        ⑴、筛选集合Where。

          

        ⑵、查询投射Select:返回新对象集合IEnumerable<TSource>Select().返回年龄大于等于30岁的人的名字:

 

        ⑶、统计数量 int Count()

        

        ⑷、多条件排序 OrderBy().ThenBy().ThenBy()

 

        ⑸、集合连接Join()

 

        ⑹、延迟加载Where

            在标准查询运算符中,Where方法就是一个典型的延迟加载案例。在实际的开发中,我们往往会使用一些ORM框架例如EF去操作数据库,Where方法的使用则是每次调用都只是在后续生成SQL语句时增加一个查询条件,EF无法确定本次查询是否已添加结束,所以没有办法在每个Where方法执行的时候确定最终的SQL语句,只能返回一个DbQuery对象,当使用带这个DbQuery对象的时候,才会根据所有条件生成最终的SQL语句去查询数据库。

        

        ⑺、即时加载FindAll

            在开发中如果使用FindAll方法,EF会根据方法中的条件自动生成SQL语句,然后立即与数据库进行交互获取查询结果,并加载到内存中去。

        SQO缺点:语句太庞大复杂。

 

    10、LINQ

        C#3.0 新语法,查询表达式和SQL风格接近的代码。以from开始,以select或group by 子句结尾。 输出是一个IEnumerable<T>或IQueryable<T>集合。

  C#4.0新特性

    1、可选参数和命名参数:

      可选参数

        ⑴、可选参数不能为参数列表的第一个参数,必须位于所有的必须选参数之后(除非没有必选参数);

        ⑵、可选参数必须指定一个默认值,且默认值必须是一个常量表达式,不能为变量;

        ⑶、所有可选参数以后的参数都必须是可选参数。

      命名参数:通过命名参数调用,实参顺序可以和形参不同。对于简单的重载,可以使用可选参数和命名参数混合的形式来定义方法,提高代码的运行效率。

    2、Dynamic特性

      Dynamic特性需引用System.Dynamic命名空间: 在方法声明中的params 关键字之后不允许有任何其他参数,并且在方法声明中只允许一个params关键字。

  C# 5.0 新特性

    1、C#5.0的新特性,最重要的就是异步和等待(async和await),其使用方式特别简单,就是在方法的返回值前面添加关键字async,同时在方法体中需要异步调用的方法前面再添加关键字await。需要注意的是这个异步方法必须以Task或者Task<TResult>作为返回值。

    可以参考:

    http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html

posted @ 2017-12-29 16:21  风中寻觅  阅读(534)  评论(0编辑  收藏  举报