.Net各版本新特性

1 .Net2.0 新特性

一:与SQL SERVER2005集成(SQL SERVER2005中包含了CLR)
二:64位支持(32位环境下开发的代码可以在64位环境下运行)
三:泛型
(1)定义:泛型指在多种数据类型上都可以操作
优点:
性能(使用System.Collections命令空间的集合类时,如果添加的是值类型,会进行装箱操作,读取时,会进行拆箱操作)
类型安全(使用泛型集合类,不允许一个集合中添加不同类型的元素)
泛型集合所有命名空间:System.Collections.Generic

(2)使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能;泛型最常用的用途是创建集合类。

namespace ConsoleApplication5

{

    class Program

    {

        static void Main(string[] args)

        {

            Test<int> intTest = new Test<int>(1);

            Console.WriteLine(intTest.GetParms());

            Test<A> ATest = new Test<A>(new A());

            Console.WriteLine(ATest.GetParms().ID);

            Console.Read();

        }

    }

 

    public class Test<T>

    {

        private T _inputParms;

        public Test(T inputParms)

        {

            _inputParms = inputParms;

        }

        public T GetParms()

        {

            return _inputParms;

        }

    }

 

    public class A

    {

        public string ID

        {

            get { return "This is ID Property.";}

        }

    }

}


:匿名方法

要将代码块传递为委托参数,创建匿名方法是唯一的方法。

namespace ConsoleApplication5

{

    delegate void WriteString(string s);

    class Program

    {

        static void Main(string[] args)

        {

            //匿名方法创建代理

            WriteString p = delegate(string j)

            {

                System.Console.WriteLine(j);

            };

            //调用匿名方法输出的结果

            p("The delegate using the anonymous method is called.");

            //代理声明的已命名实例化

            p = new WriteString(Program.NamedMethode);

            //调用已命名方法结果

            p("The delegate using the named method is called.");

            Console.Read();

        }

        //代理相关关联的有名称方法

        static void NamedMethode(string k)

        {

            System.Console.WriteLine(k);

        }

    }

}

 

五:可空类型

可空类型是System.Nullable结构的实例。可空类型可以表示其基础类型正常范围内的值,再加上一个null值。例如,Nullable<Int32>,读作“可空的Int32”,可以被赋值为-2147483648~214783647之间的任意值,也可以被赋值为null值。Nullable<bool>可以被赋值为true或false,或null。在处理数据库和其他包含可能未赋值的元素的数据类型时,将null赋值给数值类型或布尔型的功能特别有用。可空类型可以表示基础类型的所有值,另外还可以表示null值。可空类型可通过下面两种方式中的一种声明:System.Nullable<T> variable或者T? variable。T是可空类型的基础类型。T可以是包括struct在内的任何值类型,但不能是引用类型。任何值类型都可用作可空类型的基础。

可空类型的每个实例都具有两个公共的只读属性:HasValue和Value。HasValue属于bool类型。当变量包含非空值时,它被设置为true。Value的类型与基础类型相同。如果HasValue为true,则说明Value包含有意义的值。如果HasValue为false,则访问Value将引发InvalidOperationException异常。

namespace ConsoleApplication5

{

    class Program

    {

        static void Main(string[] args)

        {

            int? i = 10;

            bool? flag = null;         

            int? x = 10;

            if (x.HasValue)

            {

                System.Console.WriteLine(x.Value);

            }

            else

            {

                System.Console.WriteLine("Undefined");

            }

            //flagº??aUndefined

            if (flag.HasValue)

            {

                System.Console.WriteLine(flag.Value);

            }

            else

            {

                System.Console.WriteLine("Undefined");

            }

            Console.Read();

        }

    }

}

 

六:迭代器

迭代器是方法、get访问器或运算符,它能够在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口。只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成IEnumerable或IEnumerable接口的Current、MoveNext和Dispose方法。迭代器是可以返回相同类型的值的有序序列的一段代码;迭代器可用作方法、运算符或get访问器的代码体;迭代器代码使用yield return语句依次返回每个元素。yield break将终止迭代;可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在foreach语句中被客户端代码调用;迭代器的返回类型必须为IEnumerable或IEnumerator。

namespace ConsoleApplication5

{

    class Program

    {

        static void Main(string[] args)

        {

            DaysOfTheWeek week = new DaysOfTheWeek();

            foreach (string day in week)

            {

                System.Console.Write(day + " ");

            }

            Console.Read();

        }

    }

    public class DaysOfTheWeek : System.Collections.IEnumerable

    {

        string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

        public System.Collections.IEnumerator GetEnumerator()

        {

            for (int i = 0; i < m_Days.Length; i++)

            {

                yield return m_Days[i];

            }

        }

    }

}

 

七:部分类

当通过多个部分来定义类型时,将使用新增的类型修饰符partial。为确保与现有程序的兼容性,此修饰符有别于其他修饰符:与get和set一样,它不是一个关键字,并且其后必须紧跟下列关键字之一:class、struct或interface。局部类在.NET 2.0的aspx.cs定义中使用得非常多,在aspx页面文件建立之后,如果选择了在后台生成隐藏代码文件,则Visual Studio 2005会自动在后台的隐藏代码文件中生成一个局部类,用来处理页面的逻辑。

 

2 .Net3.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 操作。你也可以分别定义getset"protected"等访问级别。

.Net2.0框架下,我们可以这样写一个User类:

public class User

{

private int _id;

private string _name;

private int _age;

public int Id

{

get { return _id; }

set { _id = value; }

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public int Age

{

get { return _age; }

set { _age = value; }

}

}现在,可以这样简化:

 

public class User

{

public int Id { get; set; }

public string Name { get; set; }

public int Age { get; set; }

}

我们可以利用VS.NET提供的ildasm进行反编译,可以发现.NET帮我定义了私有变量,在此不再赘言。

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

C#3.0引进了var这个新关键字,在声明局部变量时可用于替代原先的类型名,即当一个变量声明标识为var类型并且该范围域中没有var名称类型存在,那么这个声明就称为隐含类型局部变量。如下(等同于//后面的显式声明):

 

var i = 5;//int

var j = 23.56;//double

var k = "C Sharp";//string

var x;//错误

var y = null;//错误

var z = { 1, 2, 3 };//错误

 

注意事项:

必须对var声明的变量赋值,因为C#中的var并不等同于VBJavascript中的var,后者中 var为一种变量类型,而在C#var并不是一种类型,它只用来隐式的声明变量,而你定义的变量类型由编译器判断;

Var声明的变量不能赋null;

Var只能声明局部变量;

不允许,改变var变量的类型

    Var x = 100;

        X = "Hello world!"

由此可知,var的变量也是强类型的变量,具有安全性。

 

匿名类型(Anonymous Types)

匿名类型允许定义行内类型,无须显式定义类型。常和var配合使用来声明匿名类型。

var p1 = new { Id = 1, Name = "tony", Age = 21 };//属性也不需要申明

var p2 = new { Id = 2, Name = "dream", Age = 21 };

var p3 = new { Id =3 , age = 21, Name = "tony"}

p1 = p2;//p1,p2结构相同,可以互相赋值 ,p1p3不是相同的对象,所以使用匿名类型时我们尽量将具有相同属性的变量,属性的顺序保持一致。

 

在这里编译器会认为p1,p2相当于:

public class SomeType

{

public int Id { get; set; }

public string Name { get; set; }

public int Age { get; set; }

}那么数组怎么定义呢?使用"new[]"关键字来声明数组,加上数组的初始值列表。像这样:

 

var intArray = new[] { 2, 3, 5, 6 };

var strArray = new[] { "Hello", "World" };

var anonymousTypeArray = new[]

{

new { Name = "tony", Age = 21 },

new { Name = "dream", Age = 22 }

};

var a = intArray[0];

var b = strArray[0];

var c = anonymousTypeArray[1].Name;

可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。

匿名类型直接继承自System. Object

匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。

 

对象初始化器 (Object Initializers)

.NET2.0框架中的类型非常依赖于属性。当生成对象实例和使用新的类型时,在.Net2.0时候我们像这样写:

 

User user = new User();

user.Id = 1;

user.Name = "tony";

user.Age = 22;VS2008中,编译器会自动地生成合适的属性setter代码,使得原来几行的属性赋值操作可以在一行完成。我们可以这样简化:像这样,对象初始化器由一系列成员对象组成,其对象必须初始化,用逗号间隔,使用{}封闭。

 

User user = new User { Id = 1, Name = "tony", Age = 21 };又例如,我把二个人加到一个基于泛型的类型为UserList集合中:

 

List<User> user = new List<User>{

new User{Id=1,Name="tony",Age=21},

new User{Id=2,Name="dream",Age=12},

};

如果有相同名字和类型的两个对象初始化器将会产生相同的实例,可以相互赋值。例如:

User user = new User { Id = 1, Name = "tony", Age = 21 };

User user2 = new User { Id = 2, Name = "tony", Age = 12 };

user = user2;

除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。例如我们可以在上面定义的User类型同时拥有一个属于School类型的叫"School"的属性:

 

User user = new User

{

Id = 1,

Name = "tony",

Age = 21,

School = new School

{

City = "Beijing",

Name = "BTBU"

}

};

集合初始化器(Collection Initializers)

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

集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为intList集合中

 

List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };对象与集合初始化器要点

 

对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。

对象初始化器允许只给一部分属性赋值,包括internal访问级别

对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。

集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法,所以只有具有Add方法的类才可以使用这种方法添加一个元素,例如ArrayList等,例如HashTable,字典等就不支持这种添加方式,因为其存在key,value两个值。

注意对象初始化器和集合初始化器中成员的可见性和调用顺序。

对象与集合初始化器同样是一种编译时技术。

 

扩展方法(Extension Methods)

往往我们需要对CLR类型进行一些操作,但苦于无法扩展CLR类型的方法,只能创建一些helper方法,或者继承类。我们来修改上面的User类:

 

public class User

{

public int Id { get; set; }

public string Name { get; set; }

public int Age { get; set; }

public string Read()

{

return "Id:" + Id + "姓名:" + Name + "年龄:" + Age;

}

}然后调用

 

var user = new { Id = 1, Name = "tony", Age = 21 };

var str = user.Read();现在有了扩展方法就方便多了。

 

扩展方法允许开发人员往一个现有的CLR类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对duck typing的支持之灵活性,与强类型语言之性能和编译时验证融合起来。

扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,使得附加的方法扩展已存在类型和构造类型成为可能。他可以对现有类功能进行扩充,从而使该类型的实例具有更多的方法(功能)。

扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。

 

扩展方法给我们一个怎样的思路呢?我们一步一步做一下!

首先声明扩展方法:通过指定关键字this修饰方法的第一个参数。注意扩展方法仅可声明在静态类中。扩展方法具备所有常规静态方法的所有能力,可以使用实例方法语法来调用。接着就可以调用扩展方法了。下面通过一个具体的实例分析一下:

例如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0框架下像这样:

 

var email = "tony_wanghongchen@hotmail.com";

if (EmailValidator.IsValid(email))

{

Response.Write("tony提示:这是一个正确的邮件地址");

}而使用扩展方法的话,我可以添加"IsValidEmailAddress()"方法到string类本身中去,该方法返回当前字符串实例是否是个合法的字符串。

 

if (email.IsValidEmailAddress())

{

Response.Write("tony提示:这是一个正确的邮件地址");

}我们是怎么把这个IsValidEmailAddress()方法添加到现有的string类里去的呢?先定义一个静态类,再定义"IsValidEmailAddress"这个静态的法来实现的。

 

public static class Extensions//静态类

{

public static bool IsValidEmailAddress(this string s)

//静态方法和this

{

Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");

return regex.IsMatch(s);

}

}注意,上面的静态方法在第一个类型是string的参数变量前有个"this"关键词,这告诉编译器,这个特定的扩展方法应该添加到类型为"string"的对象中去。然后在IsValidEmailAddress()方法实现里,我可以访问调用该方法的实际string实例的所有公开属性/方法/事件,取决于它是否是合法电子邮件地址来返回true/false

 

扩展方法不仅能够应用到个别类型上,也能应用到.NET框架中任何基类或接口上。即可用于整个.NET框架丰富的可组合的框架层扩展。

 

扩展方法要点

扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。

扩展方法的作用域是整个namespace可见的,并且可以通过using namespace来导入其它命名空间中的扩展方法。

 

扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。

 

扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。

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

Lambda表达式

我们从"所有字符串查找包含tony子字符串"说起。在C# 2.0中,匿名方法允许我们以内联的方式来实现委托实例,它提供强大的函数式编程语言,但是标记显得相当的冗长和带有强制性。我们使用C# 2.0 中的匿名方法查找,代码如下:

 

var inString = list.FindAll(delegate(string s)

{ return s.Indexof("tony") >= 0; });现在可以使用C# 3.0带来的Lambda表达式允许我们使用一种更接近人的思维、更自然的方式来实现类似于匿名方法同样的效果,看下面的代码多么简洁:

 

var inString = list.FindAll(s => s.Indexof("tony") >= 0);Lambda表达式格式:(参数列表)=>表达式或语句块

具体意义:定义Lambda接受参数列表,运行表达式或语句块返回表达式或语句块的值传给这个参数列表。

 

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

Lambda表达式的参数列表可以有一个或多个参数,或者无参数。在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中省略。

例如:

 

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

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

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

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

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

() => Console.WriteLine(); //无参数下面看这个例子:

在前面的帖子中,我们写了一个User类及增加了2个人,接下来,我们使用由LINQ提供的新的WhereAverage方法来返回集合中的人的一个子集,以及计算这个集合中的人的平均年龄:

 

List<User> user = new List<User>{

new User{Id=1,Name="tony",Age=21},

new User{Id=2,Name="tony",Age=22},

};

//获取特定人时所用的过滤条件,p参数属于User类型

var results = user.Where(p => p.Name == "tony").ToList();

//User对象的Age值计算平均年龄

var average = user.Average(p => p.Age);

 

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

 

经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据(accessing and integrating information)的复杂度的问题。其中两个最主要访问的数据源与数据库( database )和 XML 相关。

 

LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ)

 

包含 DLinq XLinq

 

C#3.0 LINQ 查询语法

首先来看一个很简单的LINQ查询例子,查询一个int 数组中小于5的数字,并按照大小顺序排列:

class Program

{

static void Main(string[] args)

{

int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };

var m = from n in arr where n < 5 orderby n select n;

foreach (var n in m)

{

Console.WriteLine(n);

}

Console.ReadLine();

}

}

上述代码除了LINQ查询语法外,其他都是我们所熟悉的语法,而LINQ查询语法跟SQL查询语法很相似,除了先后顺序。

 

Q:为何 LINQ 查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀?

A:简单来说,为了IDE的智能感知(InteliSence)这个功能,select 关键字放在后面了。

编程语言以 select 开头写LINQ查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9LINQ查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(InteliSence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。

 

我们再来看一个稍稍复杂的LINQ查询:

在我们罗列的语言字符串中,我们希望按照字符长短,分类罗列出来,实现代码如下:

static void Main(string[] args)

{

string [] languages = {"Java","C#","C++","Delphi","VB.net","VC.net","C++ Builder","Kylix","Perl","Python"};

var query = from item in languages

orderby item

group item by item.Length into lengthGroups

orderby lengthGroups.Key descending

select lengthGroups;

foreach (var item in query)

{

Console.WriteLine("strings of length ",item.Key);

foreach (var val in item)

{

Console.WriteLine(val);

}

}

Console.ReadLine();

}

其中的 into 关键字表示将前一个查询的结果视为后续查询的生成器,这里是跟 group by一起使用的。

LINQ中的Group by不要跟 SQL 中的Group by 混淆,SQL 由于是二维结构,Group by 的一些逻辑受二维结构的约束,无法象 LINQ 中的Group by 这么灵活。

 

另外,还具有以下的特性:

VS2008支持兼容多版本.net Framework 2.0,3.0,3.5

VS2008内建对asp.net AJAX 和Javascript支持。

1) VS2008支持Javascript语法智能提示

2) VS2008支持Javascript调试

3) VS 2008 ASP.NET AJAX Control Extender Support

4) 支持对Silverlight的javascript语法智能提示  

VS2008对Web Desgin和CSS的支持

1)比VS2005效率更高的HTML 编辑器
2)CSS Style Manager、 CSS Properties 窗口,更加方面的对HTML元素使用CSS
3) CSS源视图智能提示(见下图)
4)支持Nested Master Page预览
5)更加方面、强大的ListView 控件


开发语言及Linq

1)自动属性、对象初始化器及集合初始化器

2)扩展方法

3)Lamdba表示式

4) 匿名类型

5)??操作符

查看.NET Framework源代码

其他方面的提高

上面说的只是VS2008新特性的一部分,其他还有很多有待发现 如:
1)WPF Design 和Project

2)新的WCF和Workflow的Designer和project

 3) 更快的单元测试

4)持续集成

5)支持AJAX单元测试

 

 

3 .Net4.0新特性

以下各节介绍了 .NET Framework 4 的其它新增功能和改进:

·         应用程序兼容性和部署

·         核心新增功能和改进

·         Managed Extensibility Framework

·         并行计算

·         网络

·         Web

·         客户端

·         数据

·         Windows Communication Foundation

·         Windows Workflow Foundation

有关添加到现有类型中的新命名空间、新类型和新成员的列表,请参见 .NET Framework 4 中的新增类型和成员

Visual Studio 2010 Service Pack 1 (SP1) 包含对 .NET Framework 4 更新

应用程序兼容性和部署


.NET Framework 4 与使用 .NET Framework 早期版本生成的应用程序有很高的兼容性,除了提高安全性、标准遵从性、正确性、可靠性和性能所做的一些更改之外。

.NET Framework 4 不能自动使用自己的公共语言运行时版本来运行由 .NET Framework 早期版本生成的应用程序。 若要使用 .NET Framework 4 运行较早的应用程序,则必须使用 Visual Studio 中项目的属性指定的目标 .NET Framework 版本编译应用程序, 或使用应用程序配置文件中的 <supportedRuntime> 元素 可指定所支持的运行时。

如果安装 .NET Framework 4 后,您的应用程序或组件无法运行,请在 Microsoft Connect 网站上提交 bug 您可以按照 .NET Framework 4 Application Compatibility.NET Framework 4 应用程序兼容性)主题中的描述测试兼容性,并通过 Visual Studio 2010 and .NET Framework 4 WalkthroughsVisual Studio 2010 .NET Framework 4 演练)来了解新增功能。

有关迁移到 .NET Framework 4 的指南,请参见 .NET Framework 4 的迁移指南 .NET Framework 的版本兼容性

以下各节介绍了部署改进。

Client Profile

.NET Framework 4 Client Profile 比以前的版本支持更多平台,并可提供应用程序的快速部署体验。 默认情况下,一些新增的项目模板现在以 .NET Framework 4 Client Profile 为目标。 有关更多信息,请参见 .NET Framework Client Profile

进程内并行执行

此功能使应用程序能够在同一个进程中加载和启动多个版本的 .NET Framework 例如,您可以运行在同一进程中加载基于 .NET Framework 2.0 SP1 的外接程序(或组件)和基于 .NET Framework 4 的外接程序的应用程序。 较旧组件可继续使用 .NET Framework 的较旧版本,新组件则使用 .NET Framework 的新版本。 有关更多信息,请参见进程内并行执行

可移植类库

安装 Visual Studio 2010 Service Pack 1 (SP1) Portable Library Tools 后,您可创建不必重新编译即可在各种 .NET Framework 平台上运行的可移植类库。 有关更多信息,请参见可移植类库

返回页

核心新增功能和改进


以下各节介绍公共语言运行时和基类库提供的新增功能和改进。

诊断和性能

.NET Framework 的早期版本没有提供用于确定特定应用程序域是否影响其他应用程序域的方法,因为操作系统 API 和工具(例如,Windows 任务管理器)仅精确到进程级别。 .NET Framework 4 开始,您可以获得每个应用程序域的处理器使用情况和内存使用情况估计值。

可监控各个应用程序域对 CPU 和内存的使用情况。 通过托管承载 API、本机承载 API 以及 Windows 事件跟踪 (ETW),可提供应用程序域资源监控。 在启用此功能后,将在进程的生存期内收集有关进程中所有应用程序域的统计信息。 请参见新增的 AppDomain.MonitoringIsEnabled 属性。

您现在可以访问 ETW 事件以用于诊断目的,从而改进性能。 有关更多信息,请参见 CLR ETW 事件控制 .NET Framework 日志记录 另外,请参见 性能计数器和进程内并行应用程序

System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute 特性使托管代码能够处理指示损坏进程状态的异常。

全球化

.NET Framework 4 提供了新的非特定和特定区域性、更新的属性值、字符串处理的改进以及其他一些改进。 有关更多信息,请参见全球化和本地化中的新增功能

垃圾回收

.NET Framework 4 提供背景垃圾回收。 此功能替代了以前版本中的并发垃圾回收并提高了性能。 有关更多信息,请参见 垃圾回收的基础

代码协定

代码协定允许您指定方法或类型的签名没有单独表示的协定信息。 新的 System.Diagnostics.Contracts 命名空间包含的类可提供一种与语言无关的方式以前置条件、后置条件和对象固定的形式来表示编码假设。 这些协定利用运行时检查改进了测试,启用了静态协定验证并支持文档生成。 有关更多信息,请参见代码协定

仅用于设计时的互操作程序集

您不必再提供主互操作程序集 (PIA),即可部署与 COM 对象进行交互的应用程序。 .NET Framework 4 中,编译器可以嵌入互操作程序集中的类型信息,仅选择应用程序(如外接程序)实际使用的类型。 由公共语言运行时确保类型安全。 请参见在托管代码中使用 COM 类型演练:嵌入 Microsoft Office 程序集中的类型信息(C# Visual Basic

动态语言运行时

动态语言运行时 (DLR) 是一种新运行时环境,它将一组适用于动态语言的服务添加到 CLR 借助于 DLR,可以更轻松地开发要在 .NET Framework 上运行的动态语言,而且向静态类型化语言添加动态功能也会更容易。 为了支持 DLR,在 .NET Framework 中添加了新 System.Dynamic 命名空间。

表达式树由表示控制流的新类型(如 System.Linq.Expressions.LoopExpression System.Linq.Expressions.TryExpression)进行了扩展。 动态语言运行时 (DLR) 将使用这些新增类型,而 LINQ 不会使用。

此外,System.Runtime.CompilerServices 命名空间中还添加了多个支持 .NET Framework 基础结构的新类。 有关更多信息,请参见动态语言运行时概述

协变和逆变

现在,有多个泛型接口和委托支持协变和逆变。 有关更多信息,请参见泛型中的协变和逆变

BigInteger 和复数

新的 System.Numerics.BigInteger 结构是一个任意精度 Integer 数据类型,它支持所有标准整数运算(包括位操作)。 可以通过任何 .NET Framework 语言使用该结构。 此外,一些新 .NET Framework 语言(例如 F# IronPython)对此结构具有内置支持。

新的 System.Numerics.Complex 结构表示一个复数,它支持使用复数的算术运算和三角运算。

元组

.NET Framework 4 提供了用于创建包含结构化数据的元组对象的 System.Tuple 类。 它还提供了泛型元组类以支持具有 1 8 个组件的元组(即,从单一实例到八元组)。 为了支持具有 9 个或更多组件的元组对象,提供了一个具有 7 个类型参数和任何元组类型的第 8 个参数的泛型元组类。

文件系统枚举改进

新的文件枚举方法可以提高访问大文件目录或循环访问大文件中的行的应用程序的性能。 有关更多信息,请参见如何:枚举目录和文件

内存映射文件

.NET Framework 现在支持内存映射文件 可以使用内存映射文件编辑非常大的文件和创建共享内存以进行进程间通信。

64 位操作系统和进程

使用 Environment.Is64BitOperatingSystem Environment.Is64BitProcess 属性可以标识 64 位操作系统和进程。

打开基项时,可以使用 Microsoft.Win32.RegistryView 枚举指定 32 位或 64 位注册表视图。

其他新增功能

以下列表介绍其他新增功能、改进和便利。 其中的几个功能是根据客户建议增加的。

·         为了支持区分区域性的格式设置,System.TimeSpan 结构包含了 ToStringParse TryParse 方法的新重载,以及新的 ParseExact TryParseExact 方法。

·         新的 String.IsNullOrWhiteSpace 方法指示字符串是否为 null、为空或仅包含空白字符。 已向 String.Concat String.Join 方法添加了可以连接 System.Collections.Generic.IEnumerable(Of T) 集合的成员的新重载。

·         您可以使用 String.Concat 方法将可枚举集合中的每个元素连接在一起,而无需先将元素转换成字符串。

·         可以使用的两种新的简便方法是:StringBuilder.Clear Stopwatch.Restart

·         新的 Enum.HasFlag 方法确定在某个枚举值中是否设置了一个或多个位域或标志。 Enum.TryParse 方法返回一个布尔值,指示能否成功分析字符串或整数值。

·         System.Environment.SpecialFolder 枚举包含多个新文件夹。

·         现在可以使用从 System.IO.Stream 类继承的类中的 CopyTo 方法轻松地将一个流复制到另一个流中。

·         使用新的 Path.Combine 方法重载可组合文件路径。

·         新的 System.IObservable(Of T) System.IObserver(Of T) 接口为基于推送的通知提供通用机制。

·         System.IntPtr System.UIntPtr 类现在包括对加法运算符和减法运算符的支持。

·         现在可以通过将类型包装在 System.Lazy(Of T) 类内部,为任何自定义类型启用迟缓初始化。

·         新的 System.Collections.Generic.SortedSet(Of T) 类提供了一个按插入、删除和搜索后的排序顺序维护数据的自平衡树。 此类可实现新的 System.Collections.Generic.ISet(Of T) 接口。

·         System.IO.Compression.DeflateStream System.IO.Compression.GZipStream 类的压缩算法得到了改进,以便不再扩充已压缩的数据。 此外,还移除了压缩流的 4 GB 大小限制。

·         新的 Monitor.Enter(Object, Boolean) 方法重载采用布尔值引用,并仅在成功进入监视器时才自动将其设置为 true

·         可以使用 Thread.Yield 方法让调用线程执行准备好在当前处理器上运行的另一个线程。

·         System.Guid 结构现在包含 TryParse TryParseExact 方法。

·         新的 Microsoft.Win32.RegistryOptions 枚举可用于指定计算机重新启动后不保留的可变注册表项。

·         注册表项不再受限于 255 个字符的最大长度。

返回页首

Managed Extensibility Framework


Managed Extensibility Framework (MEF) .NET Framework 4 中的一个新库,可帮助您生成可扩展和可组合的应用程序。 使用 MEF 可指定可以扩展应用程序的位置,公开要提供给其他可扩展应用程序的服务并创建供可扩展应用程序使用的部件。 MEF 还可以基于元数据启用可用部件的便捷发现功能,而无需加载部件的程序集。 有关更多信息,请参见Managed Extensibility Framework 概述 Managed Extensibility Framework 有关 MEF 类型的列表,请参见 System.ComponentModel.Composition 命名空间。

返回页首

并行计算


.NET Framework 4 引入了用于编写多线程和异步代码的新编程模型,极大地简化了应用程序和库开发人员的工作。 该新模型使开发人员可以通过固有方法编写高效、细化且可伸缩的并行代码,而不必直接处理线程或线程池。 新的 System.Threading.Tasks 命名空间和其他相关类型支持此新模型。 并行 LINQ (PLINQ) LINQ to Objects 的并行实现,能够通过声明性语法实现类似功能。 有关更多信息,请参见 .NET Framework 中的并行编程

返回页首

网络


网络改进包含以下几个方面:

·         若干类中对于 Windows 身份验证的安全改进,包括 System.Net.HttpWebRequestSystem.Net.HttpListenerSystem.Net.Mail.SmtpClientSystem.Net.Security.SslStream System.Net.Security.NegotiateStream 对于 Windows 7 Windows Server 2008 R2 上的应用程序提供了扩展保护。 有关更多信息,请参见Integrated Windows Authentication with Extended Protection

·         支持使用 IPv6 Teredo 的网络地址转换 (NAT) 遍历。 有关更多信息,请参见NAT Traversal using IPv6 and Teredo

·         提供有关 HttpWebRequest 对象的信息的新的网络性能计数器。 有关更多信息,请参见联网性能计数器

·         System.Net.HttpWebRequest 类中,支持在 AddRange 方法的新重载中使用大字节范围标头(64 位范围)。 System.Net.HttpWebRequest 类的新属性允许应用程序设置很多 HTTP 标头。 可使用 Host 属性设置 HTTP 请求中独立于请求 URI Host 标头值。

·         对于 System.Net.Mail.SmtpClient 和相关类的安全套接字层 (SSL) 支持。

·         改进了对 System.Net.Mail.MailMessage 类中的邮件标头的支持。

·         对在加密中使用 null 密码的支持。 可以通过使用 System.Net.ServicePointManager 类和 EncryptionPolicy 属性指定加密策略。 System.Net.Security.SslStream 类的构造函数现在采用 System.Net.Security.EncryptionPolicy 类作为参数。

·         System.Net.NetworkCredential 类中提供了用于基于密码的身份验证方案(例如基本、摘要、NTLM Kerberos 身份验证)的凭据。 为了提高安全性,现在可将密码作为 System.Security.SecureString 实例而不是 System.String 实例进行处理。

·         System.Uri System.Net.HttpListener 类中指定如何转换和规范化使用百分号编码值的 URI 能力。 有关更多信息,请参见 System.Net.Configuration.HttpListenerElementSystem.Configuration.SchemeSettingElementSystem.Configuration.SchemeSettingElementCollection System.Configuration.UriSection 类。

返回页首

Web


ASP.NET 4 版在以下几个方面引入了新功能:

·         核心服务,包括可用来扩展缓存的新 API、支持对会话状态的数据进行压缩以及新的应用程序预加载管理器(自动启动功能)。

·         Web 窗体,包括对 ASP.NET 路由的更集中化支持、对 Web 标准的增强支持、更新的浏览器支持、数据控件的新功能以及视图状态管理的新功能。

·         Web 窗体控件,包括新的 Chart 控件。

·         MVC,包括视图的新帮助器方法、对分区的 MVC 应用程序的支持以及异步控制器。

·         动态数据,包括对现有 Web 应用程序的支持、对多对多关系和继承的支持、新的字段模板和特性以及增强的数据筛选。

·         Microsoft Ajax,包括对 Microsoft Ajax 库中的基于客户端的 Ajax 应用程序的附加支持。

·         Visual Web Developer,包括改进的 JScript IntelliSense、针对 HTML ASP.NET 标记的新的自动完成代码段和增强的 CSS 兼容性。

·         部署,包括用于自动化典型部署任务的新工具。

·         多目标,包括针对目标版本的 .NET Framework 中未提供的功能的更好的筛选功能。

有关这些功能的更多信息,请参见 ASP.NET 4 Visual Web Developer 中的新增功能

返回页首

客户端


Windows Presentation Foundation (WPF) 版本 4 包含以下方面的更改和改进:

·         新控件,包括 CalendarDataGrid DatePicker

·         VisualStateManager 支持更改控件的状态。

·         利用触控和操作,您可以创建在 Windows 7 上同时接收来自多个触控的输入的应用程序。

·         图形和动画支持布局舍入、像素着色器版本 3.0、缓存合成和缓动函数。

·         文本改进了文本呈现,并支持在文本框中自定义插入符号的颜色和选定内容的颜色。

·         InputBinding Command 属性、动态对象和 Text 属性支持绑定。

·         XAML 浏览器应用程序 (XBAP) 支持与网页通信,并且支持完全信任部署。

·         利用 System.Windows.Shell 命名空间中新增的类型,您能够与 Windows 7 任务栏通信,还能将数据传递到 Windows shell

·         Visual Studio 2010 中的 WPF Silverlight 设计器中提供了各种设计器改进,有助于创建 WPF Silverlight 应用程序。

有关更多信息,请参见 WPF 版本 4 的新增功能

返回页首

数据


ADO.NET

ADO.NET 提供了一些用于 Entity Framework 的新功能,其中包括持久性未知对象、LINQ 查询中的函数以及自定义对象层代码生成。 有关更多信息,请参见 ADO.NET 中的新增功能

动态数据

ASP.NET 4 的动态数据得到了增强,为您提供快速生成数据驱动网站的更强大功能。 这包括:

·         基于数据模型中定义的约束的自动验证。

·         可以使用属于动态数据项目一部分的字段模板轻松更改为 GridView DetailsView 控件中的字段生成的标记。

有关更多信息,请参见 ASP.NET 4 Visual Web Developer 中的新增功能

WCF Data Services — WCF 数据服务

ADO.NET 数据服务已重命名为“WCF 数据服务,它具有以下新功能:

·         数据绑定。

·         计算实体集中的实体数。

·         服务器驱动的分页。

·         查询投影。

·         自定义数据服务提供程序。

·         二进制资源的流式处理。

有关更多信息,请参见 What's New in WCF Data Services

返回页首

Windows Communication Foundation


Windows Communication Foundation (WCF) 提供以下改进:

·         基于配置的激活:取消了对具有 .svc 文件的要求。

·         System.Web.Routing 集成:通过允许使用无扩展 URL,使您能更好地控制服务的 URL

·         多个 IIS 网站绑定支持:允许您在同一网站上具有多个使用相同协议的基址。

·         路由服务:允许您基于内容路由消息。

·         支持 WS-Discovery:允许您创建和搜索可发现服务。

·         标准终结点:预定义的终结点,可允许您只指定某些属性。

·         工作流服务:通过提供用于发送和接收消息的活动、基于内容关联消息的功能以及工作流服务主机来集成 WCF WF

·         WCF REST 功能:

·         Web HTTP 缓存:允许缓存 Web HTTP 服务响应。

·         Web HTTP 格式支持:允许您动态确定服务操作做出响应的最佳格式。

·         Web HTTP 服务帮助页:提供 Web HTTP 服务的自动帮助页,此页与 WCF 服务帮助页类似。

·         Web HTTP 错误处理:允许 Web HTTP 服务以与操作相同的格式返回错误信息。

·         Web HTTP 跨域 JavaScript 支持:允许使用 JSON Padding (JSONP)

·         简化配置:减少了服务所需的配置量

有关更多信息,请参见 What's New in Windows Communication Foundation

返回页首

Windows Workflow Foundation


Windows Workflow Foundation (WF) 提供以下方面的改进:

·         改进的工作流活动模型:Activity 类提供工作流行为的基本抽象。

·         各种复合活动选项:工作流可从以传统的流控制结构为模型的新建流控制活动(如 FlowchartTryCatch Switch(Of T))受益。

·         扩展的内置活动库:活动库的新增功能包括新的流控制活动、用于操作成员数据的活动以及用于控制事务的活动。

·         显式活动数据模型:用于存储或移动数据的新增选项包括变量和方向参数。

·         增强的宿主、持久性和跟踪选项:宿主增强包括更多的运行工作流选项,使用 Persist 活动的显式保持,保持而不进行卸载,使用非持久区域阻止保持,使用宿主中的环境事务,将跟踪信息记录到事件日志,以及使用 Bookmark 对象继续挂起的工作流。

·         更简单的 WF 设计器扩展功能:新的 WF 设计器是基于 Windows Presentation Foundation (WPF) 构建的,提供了一个可在 Visual Studio 外部重新承载 WF 设计器时使用的更简单的模型。

 

4  Visual Studio 11新特性

1. 为Windows 8开发Metro风格应用程序

Visual Studio 11中包含了诸多新特性,开发者可以用JavaScript、C#、Visual Basic和C++的语言开发Windows 8 Metro应用程序的工具。

有了Visual Studio 11,开发在人员可以在Expression Blend中使用JavaScript随意添加Metro风格和架构。

由于HTML5是动态的,除非它在运行,否则无法观看到网页的布局。 而Blend’s创新模式能够使你在设计过程中同步运行且方便查看。

2.增强(2D/3D)游戏开发

Visual Studio Graphics图像工具帮助游戏开发人员更具创造力。Visual Studio 11支持资源编辑器,视觉设计,Metro风格,增强可视化的2D/3D游戏开发。

可查看、编辑图片和纹理,支持alpha channels和transparency。

视觉设计着色程序和效果文件。

调试和修改DirectX

3.代码克隆分析工具

Visual Studio提供这款工具,使开发人员能够重构代码,提高代码质量。但是这个过程依赖于开发,以确定这种可重复使用的代码是否可能发生。用Visual Studio11代码克隆分析工具检查代码,寻找重复的逻辑,使你要考虑到这个代码的可用性,即一个或多个常用的方法。该工具非常智能,它不仅能搜索代码相同的模块,而且还能搜索语义上类似的结构。

4.使用Team Explorer进行代码审查

此功能定义了Team Foundation Server中的工作流程,为团队成员的工作项目状态和路线审查请求节省时间。这些工作流程是独立于任何特定的过程或方法​​,你在项目期间的任何时间都能审查代码

审阅者可以接受或拒绝审查,并响应与代码审查有关的任何消息或查询,可添加注释或者更多。

5.探索式测试(Exploratory Testing)和增强单元测试(Unit Testing)

快速创建错误报告

探索式测试工具,可以生成一个错误报告,并在报告中显示执行错误步骤,导致意外的行为。

创建测试范例

在执行错误步骤上以生成测试范例。

管理探索式测试

当测试完成后,您可以返回到Microsoft测试管理器,从而节省了测试的细节部分,包括信息、bug、时间。

相关下载:

MSDN用户官方下载地址http://msdn.microsoft.com/en-us/subscriptions/default.aspx

微软将在当地时间9月16日上午10点提供普通用户开发者预览版的下载

Visual Studio 11开发者预览版下载地址:

http://go.microsoft.com/fwlink/?LinkId=225709

Team Foundation Server 11开发者预览版下载地址:

http://go.microsoft.com/fwlink/?LinkId=225714

Visual Studio 11新功能视频:http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-820F

如果你想了解更多微软新功能的特性,可查看 Steven SinofskyS. Somasegar’s的博客。

本文参考内容英文来源:MSDN

 

 

posted on 2011-09-17 15:34  luointer1234  阅读(1068)  评论(0编辑  收藏  举报

导航