All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
全面接触SQL语法(5)_mssql学习_编程技术
asp.net得到全部已选中的RedioButton的值_[Asp.Net教程]
使用SQLSERVER的扩展存储过程实现远程备份与恢复_[SQL Server教程]
PHP实现gzip页面压缩方法_[PHP教程]
ASP.NET,MVC+LINQ开发一个图书销售站点(4)-创建一个ASP.NET,MVC应用的原型_[Asp.Net教程]
在PHP中执行系统外部命令_php资料_编程技术
asp.net的异常处理机制讲解_[Asp.Net教程]
多国语言的实现方法在ASP.NET中_[Asp.Net教程]
20个实用PHP实例代码_[PHP教程]
技巧:用PHP程序计算时间差的几种方法_php资料_编程技术
Reading number is top 10 pictures
Breasts woman big set 1
Ashlynn Brooke photograph of a group2
Magnificent cloud2
The terra-cotta warriors3
Desktop Wallpapers1
西游日记4
水晶头骨造型的酒瓶
住院一星期,检测费两万
泳装名模阿尔贝特妮写真2
A man's favorite things15
Download software ranking
XML+Web+Service开发教程
Photoshop 8.0图象编辑软件
Boxer's Top ten classic battle4
美女写真2
Be there or be square
Red cliff
Tram sex maniac 2 (H) rar bag13
徐若瑄成名作“魔鬼天使”
功夫熊猫2(下集)
Unix video tutorial3
归海一刀 published in(发表于) 2014/1/30 1:03:03 Edit(编辑)
LINQ体验(2)——C#,3.0新语言特性和改进(上篇)_[Asp.Net教程]

LINQ体验(2)——C#,3.0新语言特性和改进(上篇)_[Asp.Net教程]

LINQ体验(2)——C# 3.0新语言特性和改进(上篇)_[Asp.Net教程]

在第一篇中,知道了Visual Studio 2008新特性,从这篇开始进入此系列的第二部分——介绍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 = new List{
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 num = new List { 0, 1, 2, 6, 7, 8, 9 };

对象与集合初始化器要点



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






添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.