整体来说。Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(假设不了解.NET2.0的朋友,请參看MSDN或者一些经典的书籍),C# 3.0新语言特性在.NET2.初级上进行了改进,这些改进的功能能够大大简化我们编敲代码。关于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这个新keyword。在声明局部变量时可用于替代原先的类型名。即当一个变量声明标识为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为keyword。能够依据后面的初始化语句自己主动判断类型,这个类型为强类型。

  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[]"keyword来声明数组。加上数组的初始值列表。像这样:

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. 能够使用newkeyword调用匿名初始化器创建一个匿名类型的对象。
  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. 对象与集合初始化器相同是一种编译时技术。

LINQ体验(2)——C# 3.0新语言特性和改进(上篇)的更多相关文章

  1. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  2. LINQ体验(1)——Visual Studio 2008新特性

    一.写本系列的目的 我平时利用课余零碎时间来学习ASP.NET3.5.LINQ.Silverlight.ASP.NET 3.5 Extensions等新东西,通过笔记形式来记录自己所学的历 程.也给大 ...

  3. Java8新语言特性

    Java8简明指南 欢迎来到Java8简明指南.本教程将一步一步指导你通过所有新语言特性.由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解.本文的最后你会熟 ...

  4. Netty 4.0 新的特性及需要注意的地方

    Netty 4.0 新的特性及需要注意的地方 这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性,让你在把你的应用程序转换到新版本的时候有个概念. 项目结构改变 Netty的包名从or ...

  5. C# 7.0新加特性

    以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉 ...

  6. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  7. C# 6.0新加特性

    1.自动属性的增强 1.1.自动属性初始化 (Initializers for auto-properties) C#4.0下的果断实现不了的. C#6.0中自动属性的初始化方式 只要接触过C#的肯定 ...

  8. C# 5.0新加特性

    1. 异步编程 在.Net 4.5中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简化了异步编程模型.如下 ...

  9. C# 2.0新加特性

    泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection<T> ...

随机推荐

  1. 解决macOS升级之后每次使用ssh都要输入密码的问题

      最近想趁着假期把跟了我2年mac的系统重做下.于是就开始行动了,经过大半天的数据备份.然后进行了全盘格式化,使用了在线更新的方式从新安装升级到了10.12.6.这里提醒下有类似的想法的同学可以采用 ...

  2. Win10中的睡眠、休眠

    共同点: 都是节能技术. 异同点: 睡眠: 需要耗电.通过键盘鼠标唤醒.唤醒速度快.将用户正在处理的数据保存到内存中,除内存以外的所有设备都停止供电. 休眠: 不需耗电.通过电源键唤醒.唤醒速度慢.将 ...

  3. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...

  4. Android通过透明度设置背景变暗

    变暗 WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.alpha=0.3f; getWindow().addFlags(Wi ...

  5. wampserver修改mysql数据库密码的简单方式

    刚装好的wampserver的数据库是没有密码的,所以可以直接登录,要设置密码,一种简单的方式如下: 打开phpMyadmin 初始状态没有密码,可以直接登录 登录之后,点击账户 点击修改权限,设置你 ...

  6. 学习笔记-java IO流总结 转载

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  7. DOS批处理命令-字符串操作

    1.字符串替换 语法结构:%变量名:替换前=替换后% @set str=teh cat in teh hat @echo %str% @set str=%str:teh=the% @echo %str ...

  8. 默认ttl参考

    UNIX 及类 UNIX操作系统 ICMP 回显应答的 TTL 字段值为 255 Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64 WINXP-32bit 回显应答的 T ...

  9. S-HR之时间空间配置

    <field name="entrys.bizDate"   dataType = "DATE"  label="生效日期" year ...

  10. web前端学习总结--JQuery

    jQuery 什么是jQuery jQuery是一个优秀的JavaScript框架,一个轻量级的JS库. 它封装了JS.CSS.DOM,提供了一致的.简洁的API. 兼容CSS3,及各种浏览器 使用户 ...