一路走来,0语言新特性

原文:《C# Version 3.0 Specification》,Microsoft
翻译:lover_P
C# 3.0(C# Orcas——魔鬼)在C#
2.0的底蕴上引进了繁多言语扩张,用以扶持高端其他函数式风格类库的创始和使用。这么些扩大使得布局性API布局具备与其它领域(如关周全据库和XML)中查询语言同样的表明工夫。那几个扩张包涵:

整理:快毕业了,这段时日从来在计划种种笔试和面试,想在学校上签个offer,由于某种牵挂,没怎么认真的对待这种面试,心中有陈设,未来须要等待……想计臆想算.NET各版本的向上进度,又不想怎么去写,在英特网找了吴孟达(Wu Mengda卡塔尔国同志的那篇作品,扩大一下,终究自个儿是个生手,扩张的也是有不当,倘使您开掘哪个地方不对了的话,您能够商酌指正,特别谢谢!

享有隐式类型的片段变量,允许通过用于起初化的表明式来推论局地变量的项目。

.net版本发展进度:

恢宏方法,使得对三个现成类型的扩充和布局具备附加措施的品类变为具体。

版本 版本号 发布日期 Visual Studio windows集成
1.0 1.0.3705.0 2002-02-13 Visual Studio .NET  
1.1 1.1.4322.573 2003-04-24 Visual Studio .NET 2003 Windows Server 2003
2.0 2.0.50727.42 2005-11-07 Visual Studio 2005  
3.0 3.0.4506.30 2006-11-06   Windows Vista, Windows Server 2008
3.5 3.5.21022.8 2007-11-19 Visual Studio 2008 Windows 7, Windows Server 2008 R2
4.0 4.0.30319.1 2010-04-12 Visual Studio 2010  

拉姆达(拉姆da)表达式,无名氏格局的一种提升,为委托项目和表明式树提供了纠正的等级次序预计和转移。

当今出到4.5了 

指标起头化器,使得组织和初阶化对象变得轻便。

.NET
Framework 各类版本之间的涉嫌图:

无名类型,由对象开首化器估量和创办出来的品类。

图片 1

具有隐式类型的数组,从数组先导化器预计出成分类型并展开创办和伊始化的数组。

此间扩展下:Common Language
Runtime:即CL讴歌ZDX公共语言运转时,当中囊括CLS公共语言专门的学业、CTS通用场目系统、JIT即时编写翻译器。大家都知晓VS中有VB/C++/F#/C#…..这么些语言生成的次第能够在.NET平台上运转,换句话说差别的言语却能够兑以后同等平台的赶过,这里运用的是MSIL微软中间语言和CLMurano公共语言运营时的功绩。

询问表明式,提供了集成的询问语法,与涉及、分级查询语言如SQL和XQuery雷同。

图片 2

表明式树,允许将Lamb达表明式表现为数据(表达式树),并不是代码(委托)。

C#2.0新特性:

 

一、泛型(Generic)
概述:
引进泛型相对是C#2.0的最大的新特点。通过“参数化类型”实现一份代码操作种种数据类型。泛型的独特之处是更加好的花色安全;更好的复用;更加高的频率和更显著的羁绊。但说实在,除了部分通用的数据布局,集结类和通用算法外,使用到泛型的地点还十分少。并且System.Collections.Generic中的类也很够用了。基本没写过自身的泛型类。
语法点:
语法方面主倘使采纳在项目名称后边参加“<T>”来传播类型参数。涉及泛型类型世襲的一条准绳是“密闭类(全数品种都已经规定)无法持续开放类(含有未规定项目)”。同期能够应用where来增添对作为参数的档期的顺序的羁绊。具体有多样:基类限制、接口约束、布局器约束和值/援引类型限定。最后极度提示,delegate也是一种档期的顺序,别忘了泛型委托。

二、泛型方法(Generic Method) 概述:
泛型方法即在章程评释中隐含类型参数。其实属泛型的源委。但泛型方法能够用在平时类中。
语法点:
重载(overload)的时候注意,约束不成为艺术签字的一局地。而重写(override),限制是会被默许世袭的。

三、佚名格局(Anonymous Method)
概述:能够直接将代码赋给委托。在进展委托实例化时能够省略掉委托项目。代码示举个例子下:
myButton.Click += delegate {//代码}
myButton.Click += myClick;
深感就是一种语法的简化。从代码的可维护性来说照旧不要为好。但又真正能使局地代码简洁一点。看团队的垄断吧。 
语法点:
要当心外表变量的生活周期会一向延伸到委托实例引用截止。尽量幸免使用。

触类旁通一下:这里聊到佚名方式,在慢慢蜕变,无名方式的裨益是不发生对象

四、迭代器(Iterator)
概述:
严谨来讲只是简化迭代器的结构罢了。只怕说简化了创制能够用于foreach的枚举集结的劳作。通过引加入关贸总协定组织键字yield来贯彻。再不要太多的关注IEnumerator了。直接在类中实现GetEnumerator(卡塔尔(قطر‎然后在for循环中用yield
return就足以了。
语法点:
可以用yield break来终止迭代。

扩充一下:这里我们供给知道达成循环输出背后的体制  

五、分部类(Partial Class)
概述:
纵然允许通过机要字partial将多少个类写在七个cs文件中。最大的用场恐怕正是将IDE自动生成的代码分开吧。大家都介意到VS05中的自动生成的代码都到designer.cs中去了吗。
语法点:
在不相同部分概念中,Attribute和Interface是加上的。当然要确认保障基类的独步一时。而abstract和sealed是有个别行使,整个类生效。语义类型访谈修饰符要保持一致。

恢宏一下:分部类(Partial
Class)在C#2.0引进,事务所方法(Partial
Method)在C#3.0引进,那八个语法脾性都怀有同等的风味:将类(或)方法的代码分散在七个地方
有些类完毕了同八个类在差别的地点去贯彻。

六、可空类型(Nullable Type) 概述:
实际上是三个泛型类型。System.Nullable<T>,T必需为值类型。并且经过“?”来作二个语法的简化。用一句代码表明正是:
int? x = null;
引进NullableType取得的劝导是,.Net的ORMapping能够做得越来越好了。
语法点:
行使HasValue属性推断是不是为null。

恢宏一下:大家知道在Sql
Server中int类型是可空的,那么只要大家在数据库中存了叁个空的age,在读取时我们在C#中是不能够对int赋空值的,引入可空类型能够解决这几个题目,对这些可空的变量使用IsDBNull来判断读取的数码是或不是为空。

七、静态类(Static Class)
概述:
能够声澳优(Ausnutria HyprocaState of Qatar个static
class。该class不可能被持续不可能被实例化,只好分包静态成员。约等于sealed
abstract。用项能够充当全局函数。其它Singleton形式的兑现更方便了。
语法点:
无法有constructor,不能有实例成员,不能够再使用sealed
abstract修饰。不能持续别的类和完结别的interface。成员不能够利用protected修饰符。

触类旁通一下:这里聊起单例情势,这里会提到线程安全与否

八、属性访器访问修饰符
概述:
能够额外对get、set中的此中贰本性子访谈其接收叁个做客修饰符。用项能够说是更加灵敏的包装吧。
语法点:
只可以在get、set的贰在那之中接受。接口中的属性访谈器不可能同一无法带有访问修饰符。索引器能够运用。

扩孙乐下:在C#3.0随后就得以完成了自动增多属性的效率,public
string
Name{get;set;},无需再定义字段,对set和get操作,当然你能够加一些料定等等

九、命名空间小名限制符
概述:能够选拔双冒号“::”使用四个命名空间的外号。如
using sc=System.Collection;
那就是说使用的时候就足以写成sc::ArrayList(卡塔尔了。
功能是更有益的调用分歧命名空间下的同名类性。

     
就写那至关心重视要的九点,别的还应该有的一些C#2.0的新特就不写了。因为离开荒的运用更远了。不问可以知道除了泛型,2.0真的不是有众多的卓有功用的变通。只怕更应关注Framework的演变吗。以上的是自个儿个人的总结,写得不详细。如若确实想掌握语法各位看官可要本身再查了。2.0已远处,C#3.0曾经来了,一股LINQ的求学热潮到了。继续发展,学好新才干,更首要是用好新本领。

扩展学一年级下:这里你可以酌量下using在C#中的应用:1、引进命名空间
2、为命名空间类型设置小名3、使用using语句定义对象的施用节制,在终止是释放能源。

 


C#3.0新特性:

 

1:隐式类型的地头变量和数组

2:对象初步值设定项

3:集合起初值设定项

4:自动完成属性

5:无名氏类型

6:扩充方法

7:分部方法定义

8:Lambda 表达式

 

关键字var

1:var能够用一些变量声明不可以用于字段能够采用于for、foreach、using语句中

2:var关键字不可能包蕴笔者对象可能聚众初阶化器,但能够通过new的新说明式

   例:var  result;//编写翻译错误

       var  result=result+1;//编写翻译错误

       var  result={1,2,3};//编写翻译错误

3:var是测算类型,不是体现档期的顺序

4:var关键字提醒编写翻译器依照先河化语句右边的表明式揣测变量的项目

5:估算类型能够是松开类型、无名类型、顾客定义类型、.NET Framework
类库中定义的连串或任何表明式

注:var关键字并不表示“变体”,也不表示该变量时松散类型化变量或中期绑定变量。它只是意味着由编写翻译器鲜明和分配最相符的体系

 

var 使用的气象

1:局地变量

   例:var i = 5;

2:在for开头化语句

   例:for(var i = 1; i < 10; ++i)

3:在foreach伊始化语句

例:foreach(var item in list)

4:在using语句

   例:using(var file = new StreamReader(“C:”))

 

一:隐式类型的地面变量和数组

注:隐形数组使用var关键字和数组开头化器创设。元素的数据类型必得能够隐式转变为同一数据类型,而且不可能为空(null卡塔尔国

       1:未有在初阶化语句的左侧隐式类型的数组使用方括号

2:扶助交错数组,不扶植多维数组

       例:var a = new [] {1,2,3} //一维数组

              var b = new []

                     {

                            new [] {1,2,3},

                            new [] {5,6}

                     }; //交错数组

 

二:对象最早值设定项

注:对象起初化器由一层层成员对象组成,其指标必需伊始化,用逗号间距,使用{}密封

1.NET 2.0写法:

    User  userInfo = new User();

    userInfo.ID = “zhuxing”;

    userInfo.Name = “czx”;

    userInfo.Age= 22;

2.NET 3.5写法:

     User userInfo = new User() {ID = “zhuxing”, Name = “czx”,  Age=22};

注:嵌套复杂属性类型

User userInfo = new User()

{

     ID=“zhuxing”,

     Name=“czx”,

     Address =new Address()

    {

        Province=“FuJian”,

        City=“ningde”

     }

};

1:可以和布局函数一齐使用,而且构造函数开始化先于对象初叶化器施行

2:允许有的赋值 

3:允许给internal 成员赋值 

public class user

    {

        public String Name { get; set; }

        public String Age { get; set; }

        private Int32 test = 25;

        internal Int32 test2;

    }

 

   public class Program

    {

        static void Main(string[] args)

        {

            user person = new user { Name = “张三”, Age = “男”, test2 =
20 };

            Console.WriteLine(“{0},{1},{2}”,person.Name, person.Age,
person.test2);

            Console.ReadLine();

        }

}

//和构造函数一同行使

public class user

    {

        public String Name { get; set; }

        public Int32 Age { get; set; }

        private Int32 test = 25;

        internal Int32 test2;

        public user(Int32 Age)

        {

            this.Age = Age;

        }

  }

public class Program

    {

        static void Main(string[] args)

        {

            user person = new user(20) { Name = “张三”, Age = 22, test2
= 20 };

            Console.WriteLine(“{0},{1},{2}”,person.Name, person.Age,
person.test2);

            Console.ReadLine();

        }

 }

三:会集起首值设定项

注: 

1:会集开头化器由一多级集合对象组成,用逗号间隔,使用{}密闭。

2:集合伊始化器会对初叶化器中的成分进行按序调用ICollection<T>.Add(T卡塔尔(قطر‎方法

例如:List<int> number=new List<int>{1,2,3,4,5};

//集结早先化器

    public class parame

    {

        public String Name { get; set; }

        public Int32 Age { get; set; }

    }

 

    public class Program

    {

        static void Main(string[] args)

        {

          IList<parame> people = new List<parame>()

          {

              new parame{ Name = “张三”, Age = 18},

              new parame{ Name = “李四”, Age = 20}

          };

          foreach (var i in people)//var 是3.0特有的

          {

              Console.WriteLine(“{0},{1}”, i.Name, i.Age);

          }

          Console.ReadLine();

        }

 }

四:自动完成属性

1、.NET2.0下写User类:

public class User

{

    private string id;//用户ID

    public string ID

    {

         get{return id;}

         Set {id=value;}

    }

   private string name;//顾客名称

   public string Name

   {

        get{return name;}

        set{name=value;}

   }

} 

2、.NET 3.5下写User类:

public class User

{

   public string ID{get;set;}

   public string Name{get;set;}

}

注:在VS二零零六像上述写法,编写翻译器自动会为类中生成叁个个体变量,并对这些变量完结公开的getter和setter访谈器

五:无名类型

注:使用new操作符和无名对象发轫化器创制三个新的指标,该对象是佚名类型的指标。

如:

       var role=new{ID=“zhuxing”,Name=“czx”};

等同于:

class _Anonymous1

{

    private string id;

    public string ID

    {

       get{return id;}

       set{id=value;}

    }

    private string name;

    public string Name

    {

      get{return name;}

      set{name=value;}

    }

}

1:无名氏类型提供了一种有益的艺术,能够用来将一组只读属性封装到单个对象中,而没有须要首先显示定义多少个类型

2:类型名由编写翻译器生成,并且无法在源代码级使用

3:那么些属性的档案的次序由编写翻译器判断

4:佚名类型平日用在询问表明式select子句中,以便回到源类别化对象的属性格集

5:佚名类型是运用new运算符和对象初阶值设定项创设的

6:无名类型是由三个或多少个只读属性组成的类类型。差异意满含别的类型的类型

(如方法或事件)

7:匿名类型是直接从指标派生的援用类型。固然应用程序无法访谈无名类型,但编写翻译器仍会为其提供八个称号。

8:若是多少个或更八个无名氏类型以同一的一一具有同等数量和项指标要是七个或更多少个无名类型以平等的逐个拥有雷同数量和档期的顺序的习性,则编写翻译器会将这几个佚名类型视为等同的类型,何况它们分享编写翻译器生成的一模一样类型消息。无名类型具备艺术范围
– 佚名类型具备艺术范围。

9:无名类型不能像属性相符包罗不安全项目。

10:由于无名氏类型上的 Equals 和 GetHashCode 方法是依照属性的
由于无名氏类型上的Equals 和 GetHashCode 方法是依隶属性的Equals 和
GetHashcode 定义的,由此仅当同一无名氏类型的四个

注:查询表明式平常使用无名类型,而那些品种只可以选拔对象初步值设定项进行最早化

例:var productInfos = from p in products

                   select new { p.ProductName, p.UnitPrice };

创办无名氏类型时重命名字段:

select new {p.ProductName, Price = p.UnitPrice};

六:扩展方法

1、扩充方法的优势

 
 1.1、允许开拓人士往四个现成的CLMurano类型的掌握公约(contract卡塔尔中增加新的措施,而不用生成子类恐怕另行编写翻译原本的品类。

   1.2、能够通过应用实例方英文法调用的静态方法
,对现存类成效实行扩大,进而使该类型的实例具有更加的多的主意(功用)。

  
1.3、允许大家在不改换源代码的图景下扩张(即增添无法改革)现成项目中的实例方法

1.4、有扶植把后日动态语言中山大学行其道的对duck
typing的支撑之灵活性,与强类型语言之性质和编译时表明融合起来

2、扩大方法的要义

  
2.1、本质为将实例方法调用在编写翻译期更改为静态类中的静态方法调用,具有静态方法的信守

   2.2、功能域是全数namespace可以见到的,而且能够通过using
namespace来导入别的命名空间中的扩张方法。

  
2.3、优先级:现成实例方法优先级最高,其次为近些日子的namespace下的静态类的静态方法,最终为较远的namespace下的静态类的静态方法

七:办事处方法定义

注:管理局地轻量级的风浪

八:Lambda 表达式

1、格式如下:(参数列表卡塔尔国=>表达式或语句块 ;

   例: var str=list.FindAll(s=>s.indexof(“mzc”)>=0);

2、参数列表能够是彰显恐怕隐式类型,在显式列表中,各种参数的体系是显式钦点的,在隐式列表中,参数的体系由Lambda表明式现身的语境自动测算类型

例:

   (x, y) => x * y;//多参数,隐式类型=>表达式

   x => x * 10;//单参数,隐式类型=>表明式

   x => { return x * 10; }; //单参数,隐式类型=>语句块

   (int x) => x * 10;//单参数,显式类型=>表达式

   (int x) => { return x * 10; };//单参数,显式类型=>语句块

   ( ) => Console.WriteLine(); //无参数

发表评论

电子邮件地址不会被公开。 必填项已用*标注