最近装上了VS2013,发现好多新特性、新功能,公司办公还在使用VS2005、VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类似。.net发展的现在已经有十多年的历史了,为了更好的理清.net的发展历史,特总结如下。

一、.net 发展历史

.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  

.NET Framework 各个版本之间的关系图:

看上图可以知道,.net framework 2.0占据了.net知识图谱的大片江山,基础地位是不容撼动的,这也就是为什么到现在为止,还有很多企业做的项目仍然是基于.net 2.0的。 .net 2.0包含的东西比较丰富,所有的基础类库都运行在CLR(公共语言运行时)环境,开发者不仅可以创建web项目,也可以创建WinForm项目,数据交互则使用ADO.NET,简单有效。

.net3.0在2.0的基础上增加了一堆F:使Client更加绚丽的WPF,面向服务编程的WCF,还有工作流WF等,当然,还有一些“甜点”——语法糖,具体下面分析。

.net3.5最主要增加了Entity Framework这种通过ORM形式的和数据库交互的方式,也引入了LINQ这种更加高效的操作数据的方法。

.net4.0则增加了对并行计算的支持。

C#2.0新特性

一、泛型(Generic)

概述:
引入泛型绝对是C#2.0的最大的新特性。通过“参数化类型”实现一份代码操作多种数据类型。泛型的优点是更好的类型安全;更好的复用;更高的效率和更清晰的约束。

语法点:
语法方面主要是使用在类型名称后面加入“<T>”来传入类型参数。涉及泛型类型继承的一条规则是“封闭类(所有类型都已确定)不能继承开放类(含有未确定类型)”。同时可以使用where来添加对作为参数的类型的约束。具体有四种:基类约束、接口约束、构造器约束和值/引用类型约束。最后特别提醒,delegate也是一种类型,别忘了泛型委托。

二、匿名方法(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是部分使用,整个类生效。语义类型访问修饰符要保持一致。

五、可空类型(Nullable type)

概述:
其实是一个泛型类型。System.Nullable<T>,T必须为值类型。并且通过“?”来作一个语法的简化。用一句代码说明就是:
int? x = null;
引入NullableType获得的启示是,.Net的ORMapping可以做得更好了。
语法点:
使用HasValue属性判断是否为null。

六、静态类(static class)

概述:
可以声明一个static class。该class不能被继承不能被实例化,只能包含静态成员。相当于sealed abstract。用途可以用作全局函数。另外Singleton模式的实现更方便了。
语法点:
不能有constructor,不能有实例成员,不能再使用sealed abstract修饰。不能继承其他类和实现任何interface。成员不能使用protected修饰符。

七、属性器访问修饰符

概述:
可以额外对get、set中的其中一个属性访问其使用一个访问修饰符。用途可以说是更灵活的封装吧。
语法点:
只能在get、set的一个中使用。接口中的属性访问器不能同样不能带有访问修饰符。索引器可以使用。

C# 3.0新特性

一、隐式类型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:\"))

二、对象初始化

注:对象初始化器由一系列成员对象组成,其对象必须初始化,用逗号间隔,使用{}封闭

1.NET 2.0写法:

User  userInfo = new User();
userInfo.ID = “123”;
userInfo.Name = “leifeng”;
userInfo.Age= ;

2.NET 3.5写法:

User userInfo = new User() {ID = “”, Name = “leifeng”,  Age=};

注:嵌套复杂属性类型

User userInfo = new User()
{
ID=“”,
Name=“leifeng”,
Address = new Address()
{
Province=“HuNan”,
City=“Changsha”
}
};

三、集合初始化

注: 

1:集合初始化器由一系列集合对象组成,用逗号间隔,使用{}封闭。

2:集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法

//例如:
List<int> number=new List<int>{,,,,}; //集合初始化器
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 = },
new parame{ Name = "李四", Age = }
}; 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;}
}

注:在VS2008像以上写法,编译器自动会为类中生成一个私有变量,并对这个变量实现公开的getter和setter访问器。

五、匿名类型

注:使用new操作符和匿名对象初始化器创建一个新的对象,该对象是匿名类型的对象。

如:

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

等同于:

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.扩展方法的第一个参数必须以this开头,参数必须是原有类的类型

七、Lambda表达式

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

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

2、参数列表可以是显示或者隐式类型,在显式列表中,每个参数的类型是显式指定的,在隐式列表中,参数的类型由Lambda表达式出现的语境自动推断类型 。

//例:
(x, y) => x * y;//多参数,隐式类型=>表达式
x => x * ;//单参数,隐式类型=>表达式
x => { return x * ; }; //单参数,隐式类型=>语句块
(int x) => x * ;//单参数,显式类型=>表达式
(int x) => { return x * ; };//单参数,显式类型=>语句块
( ) => Console.WriteLine(); //无参数

表达式树

注:表达式树允许像处理数据一样对Lambda表达式进行读取和改写,比如我们在动态查询的时候经常应用到

C# 3.5新特性

Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,C# 3.0新语言特性在.NET2.0基础上进行了改进,这些改进的功能可以大大简化我们编写程序。

.NET 3.5的新特性包括:

自动属性(Auto-Implemented Properties)

隐含类型局部变量(Local Variable Type Inference)

匿名类型(Anonymous Types)

对象与集合初始化器(Object and Collection Initializers)

扩展方法(Extension Methods)

Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

LINQ,语言级集成查询(Language INtegrated Query)

自动属性(Auto-Implemented Properties)

自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑,在VS2008中可以像下面这样编写一个类,编译器会自动地生成私有变量和默认的get/set 操作。你也可以分别定义get和set的"protected"等访问级别。

C# 4.0 新特性

Dynamic Programming

.net版本发展历史的更多相关文章

  1. Java SE/EE/ME概念理解(Java版本发展历史)

    继上一篇文章http://www.cnblogs.com/EasonJim/p/6181981.html中说的区别,其实分析的不够彻底,因此再次在这里做详细的分析. 零.Java与Sun.Oracle ...

  2. eclipse版本发展历史

    Eclipse百科 https://zh.wikipedia.org/wiki/Eclipse        # 中文维基百科 http://baike.baidu.com/subview/23576 ...

  3. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  4. ArcGIS(ESRI)的发展历史和版本历史(简介)

    作者:fenghuayoushi 来源:CSDN 原文:https://blog.csdn.net/fenghuayoushi/article/details/6677360   ESRI公司介绍   ...

  5. 【转载】Web开发技术发展历史-版本1

    原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...

  6. Hadoop发展历史简介

    简介 本篇文章主要介绍了Hadoop系统的发展历史以及商业化现状, 科普文. 如果你喜欢本博客,请点此查看本博客所有文章:http://www.cnblogs.com/xuanku/p/index.h ...

  7. Objective-C发展历史

    Objective-C发展历史 苹果图标由来: 被咬了一口苹果的LOGO是为了纪念计算机科学的创始人阿兰· 麦席森· 图灵.当年图灵由于身为同性恋者,被强行 "治疗",在被迫注射大 ...

  8. Linux发展历史大事编年表(截止2013年)

    这篇文章主要介绍了Linux发展历史大事编年表(截止2013年),Linux现在已经无处不在,是一个伟大的开原项目,让我一起来看看23年来它的发展历程吧   我们周围到处都有Linux的身影,在家中. ...

  9. JavaScript 、ECMAScript、commonJS 发展历史 与标准化发展

    本文介绍下JavaScript和 ECMAScript的诞生及发展历史,以及标准化过程. 一.JavaScript诞生 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版. ...

随机推荐

  1. 13.Xcode开发的快捷键

    1.文件 CMD + N: 新文件: CMD + SHIFT + N: 新项目: CMD + O: 打开: CMD + S: 保存: CMD + SHIFT + S: 另存为: CMD + W: 关闭 ...

  2. mysql远程快速导出csv格式数据工具

    如需转载,请经本人同意. 之前本人曾经写过一个使用 select ....into outfile原理导出数据的脚本,但该脚本值适用于本地快速导出,并不支持远程服务,故又编写了下面这个支持远程导出的脚 ...

  3. mysql删除开放用户权限

    来访用户ODBC 1,在本地的cmd中用root用户进入mysql2,创建一个ODBC的用户create user 'ODBC'@'localhost';查看用户是否创建成功select user,h ...

  4. 通过 JDBC 驱动程序使用大容量复制

    Microsoft SQL Server 包含一个名为 bcp 的受欢迎的命令行实用工具,以便将较大文件快速大容量复制到 SQL Server 数据库的表或视图中. SQLServerBulkCopy ...

  5. 287. Find the Duplicate Number hard

    287. Find the Duplicate Number   hard http://www.cnblogs.com/grandyang/p/4843654.html 51. N-Queens h ...

  6. linux修改主机名的方法

    linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname   //查看机器名#hostname -i  //查看本机器名对应的ip ...

  7. Reset CSS

    摘自<锋利的JQuery> 关于重置样式,可以参考Eric meyer的重置样式和YUI的重置样式 body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt ...

  8. Winform以任意角度旋转PictureBox中的图片的方法

    方法1: private void RotateFormCenter(PictureBox pb, float angle) { Image img = pb.Image; int newWidth ...

  9. 第47讲:Scala多重界定代码实战及其在Spark中的应用源码解析

    今天学习了scala的多重界定 T >: A <: B 表示T同时有下界和下界,下界为A,上界为B,A为B的子类型.下界必须写在前面,上界必须写在后面,位置不能颠倒. T<:A wi ...

  10. 【随记】Hello World小记

    今天装Python,如下: 突然想到,到现在,我已经数不清写过多少遍Hello World了. 最早是初一学VB的时候,用Label1在Form1上画一个,然后修改Caption属性为“Hello W ...