最近装上了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