黄明 BLOG

专注项目管理,软件工程,软件架构,.NET,MOSS开发....
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#3.0的8个新特性介绍

Posted on 2010-06-04 11:34  竹仪攸欣  阅读(142)  评论(0)    收藏  举报

 

 

1.       隐含类型局部变量

var username = "John";

var userlist = new[] { "aa", "bb", "cc" };

foreach (var u in userlist)

   Console.Write(u.ToString());

 

关键字var:让编译器推断变量的类型。

注意:

需要编译器自己去辨别的变量类型,必须在声明的时候赋值,不能是null值。

只能用于局部变量,用于字段是不可以的。

2.       匿名类型

var data = new { username = "John",age=26};

Console.WriteLine("username:{0};age:{1}",data.username,data.age);

 

匿名类型允许开发人员定义行内类型,无须显式的定义类型。

常与var一起使用,var用于声明匿名类型。

3.       扩展方法

public static class Helper

    {

        public static string MD5Hash(this string s)

        {

            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");

        }

        public static bool In(this object o, IEnumerable b)

        {

            foreach (object obj in b)

            {

                if (obj == o)

                    return true;

            }

            return false;

        }

    }

 

//调用扩展方法

Console.WriteLine("123456".MD5Hash());

Console.WriteLine("1".In(new[]{"1","2","3"}));

 

很多时候我们需要对CLR类型进行一些操作,但无法扩展的CLR类型的方法,而扩展方法使得这些需求得以实现。

注意:

定义扩展方法时,只能在静态类中定义并且是静态方法,如果扩展方法名和原油方法名发生冲突,那么扩展方法将失效。

4.       自动属性

public class Person

    {

        public string username { get; protected set; }

        public int age { get; set; }

 

        public Person()

        {

            username = "John";

        }

    }

 

Person p = new Person();

Console.WriteLine(p.username);

 

个人认为这样的意义不是很大。

编译器自动生成get,set操作以及字段,并且开发者不能使用字段也不能自定义get,set操作。

开发者可以分别定义get,set的访问级别。

5.       对象初始化器

public class Person

    {

        public string username { get; set; }

        public int age { get; set; }

        public override string ToString()

        {

            return string.Format("username:{0};age:{1}",username,age);

            //return base.ToString();

        }

    }

 

Person p = new Person() { username = "John", age = 26 };

Console.WriteLine(p.ToString());

 

C# 3.0的编译器自动做了setter的操作,简化了属性赋值操作;

注意:

允许只给一部分属性赋值,包括internal访问级别;

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

6.       集合初始化器

public class Person

    {

        public string username { get; set; }

        public int age { get; set; }

        public override string ToString()

        {

            return string.Format("username:{0};age:{1}",username,age);

            //return base.ToString();

        }

    }

 

var persons = new[] {

                new Person{username="aa",age=1},

                new Person{username="bb",age=2},

                new Person{username="cc",age=3}

            };

            foreach (var p in persons)

                Console.WriteLine(p);

7.       Lambda表达式

//1个参数的案例

var list = new[] { "aa","bb","cc"};

var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));

foreach (var v in result)

 Console.WriteLine(v);

 

Lambda表达式用于产生内联函数,其语法为:

(参数列表) => 表达式或语句块

注意:

参数列表:可以包含0~n个参数;

表达式或语句块:函数的实现部分(函数体)

 

8.       查询句法

static void Main(string[] args)

     {

         var persons = new[] {

            new Person{username="aa",age=10},

                new Person{username="bb",age=20},

                new Person{username="cc",age=30}

            };

            var sql = from p in persons

                      where p.age >= 20

                      select p.username.ToUpper();

 

            foreach (var p in sql)

                Console.WriteLine(p);

}