`
fastwind
  • 浏览: 325144 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

C# 3.0新语言特性和改进(上篇)

阅读更多

Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(如果不了解.NET2.0的朋友,请参看MSDN或者一些经典的书籍),C# 3.0新语言特性在.NET2.0基础上进行了改进,这些改进的功能可以大大简化我们编写程序。关于C# 3.0新语言特性在博客园里的很多朋友都介绍了,我在这里简单介绍一下,记录自己所学的东西,也为后面的LINQ打下基础。

C# 3.0新语言特性和改进包括:

  • 自动属性(Auto-Implemented Properties)
  • 隐含类型局部变量(Local Variable Type Inference)
  • 匿名类型(Anonymous Types)
  • 对象与集合初始化器(Object and Collection Initializers)
  • 扩展方法(Extension Methods)
  • Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

自动属性(Auto-Implemented Properties)

自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑,在VS2008中可以像下面这样编写一个类,编译器会自动地生成私有变量和默认的get/set 操作。你也可以分别定义get和set的“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; }
}

像上面这样的空的get/set属性的话,它会自动为你在类中生成一个私有成员变量,对这个变量实现一个公开的getter 和setter。我们可以使用.NET开发环境所提供的ildasm.exe(IL代码反汇编器)工具来分析程序集或者模块的内容。我就不贴图了。

隐含类型局部变量(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 };//错误

在调试状态下,编译器解释如下

隐含类型局部变量调试

隐含类型局部变量要点

  1. var为关键字,可以根据后面的初始化语句自动推断类型,这个类型为强类型。
  2. 初始化语句必须为表达式,不可以为空。且编译时可以推断类型。一旦初始化之后,只可以存储这种类型。
  3. var声明的仅限于局部变量,不可用于字段。亦可以用于for,foreach,using 等语句中。
  4. 数组也可以作为隐含类型。
  5. 初始化语句不能是一个自身的对象或者集合初始化器,但是他可以是包含一个对象或者初始化器的一个new表达式。
  6. 如果局部变量声明包含了多个声明符,其类型必须相同。

匿名类型(Anonymous Types)

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

var p1 = new { Id = 1, Name = "YJingLee", Age = 22 };//属性也不需要申明
var p2 = new { Id = 2, Name = "XieQing", Age = 25 };
p1 = p2;//p1,p2结构相同,可以互相赋值

匿名类型调试

在这里编译器会认为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 = "YJingLee", Age = 22 }, 
    new { Name = "XieQing", Age = 25 } 
};
var a = intArray[0];
var b = strArray[0];
var c = anonymousTypeArray[1].Name;

匿名数组调试

匿名类型要点

  1. 可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
  2. 匿名类型直接继承自System. Object。
  3. 匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。

对象与集合初始化器(Object and Collection Initializers)

对象初始化器 (Object Initializers) :

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

User user = new User();
user.Id = 1;
user.Name = "YJingLee";
user.Age = 22;

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

User user = new User { Id = 1, Name = "YJingLee", Age = 22 };

又例如,我把二个人加到一个基于泛型的类型为User的List集合中:

List<User> user = new List<User>{
    new User{Id=1,Name="YJingLee",Age=22},
    new User{Id=2,Name="XieQing",Age=25},
};

对象初始化器调试

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

User user = new User { Id = 1, Name = "YJingLee", Age = 22 };
User user2 = new User { Id = 2, Name = "XieQing", Age = 25 };
user = user2; 

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

User user = new User
{
    Id = 1,
    Name = "YJingLee",
    Age = 22,
    Address = new Address
    {
        City = "NanJing",
        Zip = 21000
    }
};

集合初始化器(Collection Initializers):

集合初始化器由一系列集合对象组成,用逗号间隔,使用{}封闭。
集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为int的List集合中

List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };

对象与集合初始化器要点

  1. 对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
  2. 对象初始化器允许只给一部分属性赋值,包括internal访问级别
  3. 对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。
  4. 集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法。
  5. 注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
  6. 对象与集合初始化器同样是一种编译时技术。
分享到:
评论

相关推荐

    C# 3.0新语言特性和改进

    C# 3.0是.NET Framework 3.5的一部分,带来了许多新的语言特性和改进,旨在提高开发效率和代码简洁性。以下是对这些特性的详细解释: 1. **自动属性(Auto-Implemented Properties)** 自动属性是C# 3.0引入的一个...

    C#3.0语言特性

    C# 3.0是微软推出的面向对象编程语言的一个重要版本,它在C# 2.0的基础上进行了许多改进和新增了多个语言特性。本文档将深入探讨C# 3.0的关键特性,并与C# 2.0进行对比。 1. **泛型**:在C# 2.0中引入的泛型为代码...

    C# 3.0 语言定义文档

    C# 3.0 是微软推出的面向对象编程语言的一个重要版本,它在C# 2.0的基础上进行了诸多改进和扩展,为开发人员带来了许多新的特性和功能。这份"Microsoft C# 3.0 Language Specification"是官方提供的权威文档,详细...

    C#3.0新特性 NET2.0基础上进行了改进

    ### C# 3.0 新特性详解:基于 .NET 2.0 的改进 #### 一、概述 C# 3.0 是一种面向对象的编程语言,它为开发人员提供了一种简洁、高效的方式来构建应用程序。随着 .NET 框架的发展,C# 3.0 在 .NET 2.0 基础上引入了...

    C# 3.0:A Beginner’s Guide

    这本书覆盖了C# 3.0版本的所有新特性与基本概念,对于希望掌握这门现代化、面向对象的编程语言的读者来说,是一本不可多得的资源。 ### C# 3.0简介 C# 3.0是微软在.NET Framework 3.5中推出的重要更新,它引入了...

    C#3.0 in a nutshell

    这本书是C#开发者的重要参考资料,涵盖了C# 3.0的新特性和核心概念,旨在帮助程序员理解和掌握这个强大的.NET框架语言。 C# 3.0在C# 2.0的基础上引入了许多创新性功能,其中最显著的是对面向服务编程的支持和语言...

    c#3.0入门经典教程

    C# 3.0对泛型进行了改进,支持泛型接口和泛型委托,增加了类型约束,如`where T : class`或`where T : struct`,提高了代码的复用性和类型安全性。 五、其他特性 1. 部分类型(partial types):允许将大型类定义...

    vs2008视频教程 2 C#3.0与VB9.0的新特性介绍

    【标题】:“vs2008视频教程 2 C#3.0与VB9.0的新特性介绍” 本视频教程聚焦于Visual Studio 2008中的编程语言C# 3.0和Visual Basic 9.0的最新特性。Visual Studio 2008作为微软开发工具的重要组成部分,它在提升...

    C# 3.0与.NET 3.5高级编程.rar

    C# 3.0是.NET Framework 3.5的一部分,引入了许多新的特性和改进,使得C#在编程效率和灵活性上有了显著提升。这本书详细阐述了这些新特性,旨在帮助开发者掌握更高级的编程技巧和最佳实践。 首先,C# 3.0的重要更新...

    C# 3.0的新特性学习

    C# 3.0是.NET Framework 3.5的一部分,发布于2007年,引入了许多创新性特性和改进,极大地提升了开发人员的工作效率和代码的可读性。在这个版本中,C#语言主要关注了面向对象编程的增强、语言集成查询(LINQ)以及...

    c#3.0语言配置

    C# 3.0是微软推出的面向对象编程...总之,C# 3.0语言配置的改进极大地增强了C#的灵活性和生产力,使开发者能以更高效、更优雅的方式编写代码。通过学习和应用这些特性,开发者可以构建出更加健壮、可维护的软件系统。

    C# 3.0 官方语言规范 完整版 包含C#2.0及3.0扩展部分

    C# 3.0是微软开发的面向对象的编程语言的一个重要版本,它在C# 2.0的基础上增加了一些显著的新特性和扩展。官方语言规范详细定义了C# 3.0的所有语法、语义以及编程模型,是开发者理解和掌握C# 3.0的关键资源。 1. *...

    C# 3.0 完全参考手册

    C# 3.0 是微软推出的面向对象编程语言的一个重要版本,它在C# 2.0的基础上进行了诸多改进和扩展,引入了多项创新特性,为.NET Framework 3.5的一部分。在这本完全参考手册中,我们将深入探讨C# 3.0的关键知识点。 1...

    C#3.0本质论

    根据提供的文件信息,本文将围绕"C#3.0本质论"这一主题展开,深入探讨C#3.0版本的关键特性、改进以及它在.NET框架中的应用。虽然提供的链接无法直接访问,但我们可以基于标题和描述中提及的信息进行讨论。 ### C#...

    精通C#3.0与.net3.5高级编程 实例下载

    《精通C#3.0与.NET 3.5高级编程》是一本专注于深入理解C#语言和.NET Framework 3.5平台的高级技术书籍。通过实例下载,读者可以亲自动手实践,加深对理论知识的理解。 C# 3.0是微软在.NET Framework 3.5中引入的...

    C#3.0语言规范(CN完整版).pdf

    《C#3.0语言规范》是一份详尽的技术文档,由Microsoft Corporation出版,涵盖了C#3.0版本的所有核心特性和语法规范。这份文档对于软件开发者,尤其是那些使用C#进行应用程序开发的专业人士来说,是极其宝贵的资源。...

    C# 3.0 锐利体验系列课程(1)

    C# 3.0是微软.NET Framework 3.5的一部分,它引入了许多创新特性,显著提升了C#作为编程语言的灵活性和效率。本系列课程旨在深入讲解这些新特性,帮助开发者充分利用C# 3.0的功能,提升开发效率和代码质量。 首先,...

    c# 3.0 新特性(en)

    C# 3.0是.NET Framework 3.5的一部分,引入了一系列重要的新特性,极大地提升了开发效率和代码的可读性。以下是对这些特性的详细解释: **1. 隐式类型局部变量 (Implicitly typed local variables)** 在C# 3.0中,...

    C# 3.0 语言定义文档(微软官方版).pdf

    从给定的文件信息来看,我们主要关注的是关于C# 3.0语言定义文档的知识点,这涉及到C#编程语言的重要更新与特性。C# 3.0是微软在.NET框架下推出的一种面向对象的编程语言,它在C# 2.0的基础上进行了大量的改进和增强...

    C#3.0语言规范

    C# 3.0语言规范是微软为C#编程语言制定的一套详细的语法和语义规则,它定义了程序员如何编写、编译和运行C#程序。这份规范旨在确保跨平台和跨工具的代码一致性,使得开发者能更好地理解和利用C#的强大功能。以下是...

Global site tag (gtag.js) - Google Analytics