搜索: 标题内容作者  
  首页C#教程C#基础
背景:
阅读新闻

Visual C# 3.0 新特性展示

[日期:2007-07-05]   来源:互联网整理  作者:佚名   [字体: ]
    新闻简介:在发布Visual Studio 2005和C#2.0之后,微软公司又马不停蹄的展示了人们所期望的C#的下一代版本:C# 3.0。尽管C# 3.0并没有标准化,微软还是在PDC(专业程序员会议)发布了一个预览版本,因此心急的程序员可以看到一些所期望的特性,这也是本文所讨论的主要内容:
        关 键 词:  

在发布Visual Studio 2005和C#2.0之后,微软公司又马不停蹄的展示了人们所期望的C#的下一代版本:C# 3.0。尽管C# 3.0并没有标准化,微软还是在PDC(专业程序员会议)发布了一个预览版本,因此心急的程序员可以看到一些所期望的特性,这也是本文所讨论的主要内容:

  ·隐式类型本地变量

  ·匿名变量

  ·扩展方法

  ·对象和Collection初始化符

  ·Lambda表达式

  ·查询表达式

  ·表达式树

  隐式类型本地变量

  C# 3.0引进了一个新的关键字叫做\"Var\"。Var允许你声明一个新变量,它的类型是从用来初始化符变量的表达式里隐式的推断出来的。也就是说,如下的表达式是有效的格式:

var i = 1;
  这一行使用了1来初始化符变量i。注意这里i被强类型到整型,它不是一个对象或者vb6的变量,也不带有其他对象或者变量的负载。
为了保证使用var关键字进行声明的变量的强类型特性,C#3.0要求你将赋值(初始化符)放到和声明(声明符)的同一行。同样,初始化符必须是一个表达式,不能是一个对象或者collection初始化符,也不能为null。如果多个声明符对同一个变量存在,那么它们必须在编译时被视作相同类型。

  另一方面,隐式类型数组,可以使用一点不同的格式,如下所示:

var intArr = new[] {1,2,3,4} ;
  上面一行的代码将声明intArr为int[].

  var关键字允许你使用匿名类型的实例,因而这些实例就是静态类型的。所以,当你创建一个包含一组数据的对象的实例的时候,你不必要预先定义一个类可以同时支持这个结构和在一个静态类型变量里的数据。

  匿名变量

  C# 3.0使得你可以灵活的创建一个类的实例,而无需先写这个类的代码。所以你可以这样写代码:

new {hair=\"black\", skin=\"green\", teethCount=64}
  上一行代码,通过new关键字的帮助,创建了有三个属性的类型:hair,skin和teethCount。这样C#编译器就会创建一个类如下:

class __Anonymous1
{
 private string _hair = \"black\";
 private string _skin = \"green\";
 private int _teeth = 64;
 public string hair {get { return _hair; } set { _hair = value; }}
 public string skin {get { return _skin; } set { _skin = value; }}
 public int teeth {get { return _teeth; } set { _teeth = value; }}
}

  事实上,如果另外一个满足了相同的名称和类型顺序的匿名类型也被创建了,编译器也会聪明的只创建一个匿名类型来支持两个实例来使用。同样,因为实例都是一个类的简单实例,它们可以进行互换因为类型实际上是一样的。

  现在你拥有了这个类,但是你还需要一些东西来支持以上的类的某个实例。这就是\"var\"关键字的作用。它让你拥有一个以上匿名变量的实例的一个静态类型实例。这里有一个简单好用的匿名类型的使用例子:

var frankenstein = new {hair=\"black\", skin=\"green\", teethCount=64}
  扩展方法

  扩展方法使你能够使用额外的静态方法来扩展各种类型。不过它们是非常有限的,也只能在实例方法不足够的情况下才作为候补使用。

  扩展方法只能在静态类中被声明,并且以关键字\"this\"放在方法的第一个参数前来标识,如下就是一个有效的扩展方法的例子:[Page]

public static int ToInt32(this string s)
{
 return Convert.ToInt32(s) ;
}

  如果一个包含以上方法的静态类被使用\"using\"关键字引进,ToInt32犯法将会出现在已有的类型中(虽然比现有的实例方法优先级低),你可以这样编译和执行代码:

string s = \"1\";
int i = s.ToInt32();

  这使得你可以充分享用各种以有的内建的或者定义的类型的扩展特性,并且给它们加上新的方法。

C# 3.0被希望来允许你包含一个初始化符,从而指定一个新创建的对象或者collection的初始值。这使得你能够一步结合声明和初始化。

  举例来说,你可以这样定义CoOrdinate类:

public class CoOrdinate
{
 public int x ;
 public int y;
}

  你然后可以使用一个对象初始化符来声明和初始化一个CoOrdinate对象,就像这样:

var myCoOrd = new CoOrdinate{ x = 0, y= 0} ;
  也许你要问,为什么不要像下面这样做呢?

var myCoOrd = new CoOrdinate(0, 0) ;
  注意:我从来没有为我的类声明过一个接受两个参数的构造器。事实上,使用一个对象初始化符来初始化对象等同于调用一个无参数(缺省)构造器并且给相关量赋值。

  类似的,在C#3.0里你可以轻松的用一种更加简洁的方式给collection赋值,如下的C# 2.0的代码:

Listanimals = new List();
animals.Add(\"monkey\");
animals.Add(\"donkey\");
animals.Add(\"cow\");
animals.Add(\"dog\");
animals.Add(\"cat\");

  可以缩短为:

Listanimals = new List{\"monkey\", \"donkey\", \"cow\", \"dog\", \"cat\" } ;
  Lambda表达式:匿名方法的浓咖啡

  C# 1.X允许你在方法里写代码段,你可以轻松的使用委托(delegate)来调用。委托无疑是有用的,并且可以在框架里任意使用,但是在很多实例里你必须为了使用它而声明一个方法或者一个类。因此,为了给你一个更加容易和简洁的编码方式,C# 2.0允许你使用匿名方法替换标准调用到委托。如下代码可以在.NET1.1或者更早的版本看到:

If you believe an article violates your rights or the rights of others, please contact us.

收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻      
友情链接
本文评论   [发表评论] 全部评论 (0)
赞助商广告
热门评论