.net版本发展历史
最近装上了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版本发展历史的更多相关文章
- Java SE/EE/ME概念理解(Java版本发展历史)
继上一篇文章http://www.cnblogs.com/EasonJim/p/6181981.html中说的区别,其实分析的不够彻底,因此再次在这里做详细的分析. 零.Java与Sun.Oracle ...
- eclipse版本发展历史
Eclipse百科 https://zh.wikipedia.org/wiki/Eclipse # 中文维基百科 http://baike.baidu.com/subview/23576 ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- ArcGIS(ESRI)的发展历史和版本历史(简介)
作者:fenghuayoushi 来源:CSDN 原文:https://blog.csdn.net/fenghuayoushi/article/details/6677360 ESRI公司介绍 ...
- 【转载】Web开发技术发展历史-版本1
原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...
- Hadoop发展历史简介
简介 本篇文章主要介绍了Hadoop系统的发展历史以及商业化现状, 科普文. 如果你喜欢本博客,请点此查看本博客所有文章:http://www.cnblogs.com/xuanku/p/index.h ...
- Objective-C发展历史
Objective-C发展历史 苹果图标由来: 被咬了一口苹果的LOGO是为了纪念计算机科学的创始人阿兰· 麦席森· 图灵.当年图灵由于身为同性恋者,被强行 "治疗",在被迫注射大 ...
- Linux发展历史大事编年表(截止2013年)
这篇文章主要介绍了Linux发展历史大事编年表(截止2013年),Linux现在已经无处不在,是一个伟大的开原项目,让我一起来看看23年来它的发展历程吧 我们周围到处都有Linux的身影,在家中. ...
- JavaScript 、ECMAScript、commonJS 发展历史 与标准化发展
本文介绍下JavaScript和 ECMAScript的诞生及发展历史,以及标准化过程. 一.JavaScript诞生 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版. ...
随机推荐
- Win7上的ASP.NET MVC3项目在Win10上运行的一个坑
先解释一下问题:我原来的电脑环境是Win7+VS2015,因为新换了个电脑环境变成Win10+VS2015了,所以就把原先的项目复制到新的机器上,那么问题来了,原先的一个项目在VS2015上打开竟然直 ...
- mysql解压缩安装(一)
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- DUT Star Round2
A.Zeratu的军训游戏 Problems: 开灯问题,问无数次操作之后第n盏灯的状态 Analysis: cj:平方数有奇数个约数 Tags: Implementation B.Zeratud的完 ...
- 在安卓下打包cocos2d-js 3.6项目with ProtoBuf.js
项目用到了cocos2d-js 3.6和ProtoBuf.js,但是打包成apk时运行时总是报错(evaluatedOK == JS_FALSE),没有具体的文件和行号报错信息. 只能一个一个文件排查 ...
- python+eclipse环境搭建
一.Eclipse 的安装 Eclipse的安装是很容易的.Eclipse是基于java的一个应用程序,因此需要一个java的运行环境(JRE)才行.(我这里主要介绍windows下的安装) JRE的 ...
- Centos 6.X基本维护操作
设置163源,全新最小化安装时,更改源需先yum install wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- step by step 之餐饮管理系统六(数据库访问模块)
距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...
- ExtJS 列表数据编辑
在ExtJs中,GridPanel一般用于展示列表数据.同时利用一些附加的插件也能编辑数据.类似于asp.net中的DataGridView控件. 展示数据比较简单,利用Store则可以自动展示,只要 ...
- [置顶]PADS PCB功能使用技巧系列之NO.005- 如何正确使用Verify Design?
有没有遇到过进行Verify Design通过后,回来的样板仍然出现短路或其它莫名其妙的问题?此情此景,你是否一度对PADS失去的希望?但,工具是没有问题的,看看怎么样正确有效地使用它吧.主要需要注意 ...
- firefox安装firebug\XPath Checker
XPath Checker安装,打开下面地址安装: https://addons.mozilla.org/en-US/firefox/addon/xpath-checker/ 安装XPath Chec ...