[C#3.0]新特性概览

  自从看了ScottGu的几篇文章后就有想让C#3.0的一些新特性在我的博客上也留下历史地一页。但是由于环境不允许好久都没有用上.NET 3.0,今天终于忍不住地要动一动键盘满足一下自己的欲望,因为我自己的电脑上安装了.NET 3.0 Framework SDK。在这里我总结一下前辈们的研究成果,也为进一步巩固自己的知识以便今后的开发,同时也希望能够给大家带来一点回忆。

   下面我们来看一看我们在脚本中常用的变量的声明的"var"关键字,美其名曰隐式声明变量,所申明变量的类型由第一个对其赋值(初始化)所决定的。依我的个人观点,这将降低代码的可读性,但是有人说这个关键字主要是针对LinQ而设计得,因为LinQ所涉及的类型可能相当的复杂或在申明变量时还不知道其类型。根据前人的经验总结这个关键字只是为了忽悠我们,在编译下还是强类型的,在IL中并没有出现新的东西。值得注意的是用var声明的变量一定要初始化,如果对于几何类型的初始化时还必须指名其类型。下面我们来看看例子:
1var num=0;//num int
2var nums=new []{1,2,3,4,5};//nums int[]
3var str='';//str string
4var list=new List<int>();//int 要指出
5foreach(var i in nums){
6    num+=i;
7}

  还有一个很神奇得新东西名字叫:扩展方法。相信大家都已经听说过或已经用过这个新特性,这个也是我所喜欢的新特性之一,我们可以将我们自己扩展的方法弄到如string类型中,而且在VS编写代码时能够智能提示。在ScottGu的文章里我们知道,对于扩展的方法必须在静态类里来扩展。例如我们要写一个验证一个字符串长度的方法,我们可以这样写:
 1namespace NExplus.CSharp3Feature
 2{
 3  public static class MethodExtend
 4  {
 5     public static bool OutLength(this string str){
 6               if(str.Length>10)return true;
 7               return false;
 8        }

 9    }

10}
  如果你想调用这个函数可以在你所有调用的类中引入所在的命名空间(using NExplus.CSharp3Feature;)然后就可以在自己的方法中调用这个方法:string.OutLength(yourstring);是不是很神奇。大家都知道Object是所有类的始祖,如果扩展Object的方法会怎么样呢?在所有类中都能调用你所扩展的方法,在这里就不在赘述,不信你可以试一下,呵呵。

   接下来我们看看对象初始化等的简化,大家就不要在抱怨写实体类了,在.NET 3.0中简化了不少,咱们一起看看吧。
public class Person{
  
public Name{get;set;}
  
public NickName{get;set;}
}


var person
=new Person{Name="xiaobing",NickName="网魂小兵"};

var persons
==new List<Person>{
    
new Person{Name="xiaobing",NickName="网魂小兵"},
    
new Person{Name="xiaobing1",NickName="网魂小兵1"}
};
  是不是很Happy,以后写代码就可以不用那么辛苦了,初始化也简化了不少,不要在象2.0先new 一个然后在add。在我们享受这美好的特性时,更激动人心的当然是Lambda表达式了,不用急让我给你慢慢道来。

   关于Lambda表达式的文章网上流传很多,一搜一大堆,主要他和LinQ有比较好的结合。在LinQ中经常都会用到这种表达式,其实Lambda表达式也就是代理的升级版,引用一下别人的例子我们来看一下在各个版本中使用代理的不同代码:

  假设你需要创建一个按钮,当点击它的时候更新ListBox里的内容。在C#1.0和1.1里,你要这样做:
 1public MyForm()
 2{
 3 listBox = new ListBox();
 4 textBox = new TextBox();
 5 addButton = new Button();
 6 addButton.Click += new EventHandler(AddClick);
 7}

 8void AddClick(object sender, EventArgs e)
 9{
10 listBox.Items.Add(textBox.Text);
11}
  而在2.0中可以这样,代码如下:
1public MyForm()
2{
3 listBox = new ListBox();
4 textBox = new TextBox();
5 addButton = new Button();
6 addButton.Click += delegate
7 {
8  listBox.Items.Add(textBox.Text);
9}
;
  你如果没有熟悉1.0和1.1中的代理,没有学会使用2.0中的代理,没关系在3.0的lambda表达式更简化了代理,代码如下:
1public MyForm()
2{
3   
4   addButton.Click=>listBox.Items.Add(textBox.Text);
5}

  由于Lambda一两句话一说不出它的精妙所在,在LinQ中会大量应用到这个表达式,大家以后慢慢体会吧!到目前为止我想最值得期待的肯定是LinQ了,他也是.NET 3.0中的一个新东东,它将关系型查询语句引入面向对象的世界, 大大增强了语法安全性。而且也对那些SQL感冒的开发人员来说也是一次新的革命啊,我的一个同事就是这样的想法:)关于LinQ这方面的文章也是很多,语法表达能力很强大,where , select , group , orderby , into 的语法都有支持,而且我也没有很好的学习这个东东,只是大体上的了解,也没有真正用过它,听说有一个论坛要用这个来开发,不知道效果怎么样?这里就对LinQ作个简单的介绍。

   以上是迄今为止所能够了解到的新特性,不知道.NET 3.5是个什么概念,微软的步伐还真快,我追啊追啊还是追不上。听说很多程序还在用1.1,现在还有很多公司在开发1.1的程序,不知道是怎么个想法,不过我已经忘却1.1,胸怀2.0,将要奔向3.0,未来的理想是3.5。本人水平有限,参考了一些资料,写得不好请大家见谅,如果觉得我盗版可以给我留言:)

关于作者:网魂小兵

文章出处:http://xdotnet.cnblogs.com

本文可以随意转载,摘抄等非商业用途。

为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处。

原文地址:https://www.cnblogs.com/xdotnet/p/csharp3feature_overview.html