C#3.0新特性

来源:互联网 发布:人工智能的利弊辩论 编辑:程序博客网 时间:2024/05/21 14:58

C# 3.0 语言和编译器引入了多种新的语言功能。这些新的语言构造可以分别用在各种上下文中,并且可以共同完成语言集成查询 (LINQ)。下表列出了新增的 C# 3.0 语言功能:

1、隐式类型的本地变量和数组(类型推断)

1.1、概述

  可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型,下面的示例演示了使用 var 声明局部变量的各种方式
  

// i is compiled as an intvar i = 5;// s is compiled as a stringvar s = "Hello";// a is compiled as int[]var a = new[] { 0, 1, 2 };// expr is compiled as IEnumerable<Customer>// or perhaps IQueryable<Customer>var expr =    from c in customers    where c.City == "London"    select c;// anon is compiled as an anonymous typevar anon = new { Name = "Terry", Age = 34 };// list is compiled as List<int>                             var list = new List<int>();

  需要了解的一点是,var 关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。它只是表示由编译器确定和分配最适当的类型。

1.2、备注

  下列限制适用于隐式类型的变量声明:

  • 只有在同一语句中声明和初始化局部变量时,才能使用 var;不能将该变量初始化为 null、方法组或匿名函数。

  • 不能将 var 用于类范围的域。

  • 由 var 声明的变量不能用在初始化表达式中。换句话说,表达式 int i = (i = 20) 是合法的;但表达式 var i = (i
    = 20) 则会产生编译时错误。

  • 不能在同一语句中初始化多个隐式类型的变量。

  • 如果范围中有一个名为 var 的类型,则 var 关键字将解析为该类型名称,而不作为隐式类型局部变量声明的一部分进行处理。

  • 在很多情况下,var 是可选的,它只是提供了语法上的便利。但是,在使用匿名类型初始化变量时,如果需要在以后访问对象的属性,则必须将该变量声明为 var。这在 LINQ 查询表达式中很常见

2、对象初始值设定项

2.1、概述

   使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。如下:
   

 public class Person    {         // Auto-implemented properties        public string Name { get; set; }        public int Age { get; set; }    }    class Program    {        static void Main(string[] args)        {            // Object initializer            Person p = new Person { Name="sandy",Age=20};        }    }

3、集合初始值设定项

3.1、概述

  使用集合初始值设定项可以在初始化一个实现了 IEnumerable 的集合类时指定一个或多个元素初始值设定项。元素初始值设定项可以是简单的值,也可以是表达式或对象初始值设定项。通过使用集合初始值设定项,您将无需在源代码中指定多个对该类的 Add 方法的调用;编译器会添加这些调用。
  示例demo如下:
  

List<int> listInt = new List<int> { 0, 1, 2, 3, 4, 5  };            List<Person> listP = new List<Person> {                 new Person(){Name="robbin",Age=10},                new Person(){Name="sandy",Age= 20}            };

4、扩展方法

4.1、概述

  扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用,扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中
  

public static class StrExtensions    {        public static int WordCount(this String str)        {            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;        }    }    class Program    {        static void Main(string[] args)        {            string s = "Hello Extension Methods";            int i = s.WordCount();            Console.WriteLine(i);        }    }

5、匿名类型

5.1、概述

  匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断
  

var v = new { Amount = 108, Message = "Hello" };

6、Lambda表达式

更多内容:Lambda 表达式(C# 编程指南)

7、查询关键字

更多内容:查询关键字(C# 参考)

8、自动实现属性

8.1、概述

  当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明变得更加简洁。当您如下面的示例所示声明属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访问器进行访问,如下:
  

class LightweightCustomer{    public double TotalPurchases { get; set; }    public string Name { get; private set; } // read-only    public int CustomerID { get; private set; } // read-only}

9、分部方法定义

9.1、概述

  可以将类或结构、接口或方法的定义拆分到两个或多个源文件中。每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。
  在以下几种情况下需要拆分类定义:
  

  • 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。

  • 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。Visual Studio 在创建 Windows 窗体、Web
    服务包装代码等时都使用此方法。无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。

  • 若要拆分类定义,请使用 partial 关键字修饰符,如下所示:

public partial class Employee{    public void DoWork()    {    }}public partial class Employee{    public void GoToLunch()    {    }}

分部方法简单一句话,就是分部类中定义的方法。

参考资料
1、C#3.0 中的新增功能