[1]新的C#语言特性:自动属性(Automatic Properties)
public class Person {
public string FirstName {
get; set;
}
public string LastName {
get; set;
}
public int Age {
get; set;
}
}
可以通过上面的代码来代替之前的:
public class Person {
private string _firstName;
private string _lastName;
private int _age;
public string FirstName {
get {
return _firstName;
}
set {
_firstName = value;
}
}
public string LastName {
get {
return _lastName;
}
set {
_lastName = value;
}
}
public int Age {
get {
return _age;
}
set {
_age = value;
}
}
}
新C#编译器通过一个叫“自动属性(automatic properties)”的
语言特性提供了一个优雅的方式来使得你的编码更加简洁,同时
还保持属性的灵活性。自动属性允许你避免手工声明一个私有成
员变量以及编写get/set逻辑,取而代之的是,编译器会自动为
你生成一个私有变量和默认的get/set 操作。
譬如,使用自动属性
public class Person {
public string FirstName { get; set; }
public string LastName { get;set; }
public int Age { get; set; }
}
[2]C#语言的新特性:对象初始化器(Object Initializers)
以前申请对象,初始化对象需要这样:
Person person = new Person();
person.FirstName = "Scott";
person.LastName = "Guthrie";
person.Age = 32;
而今只需要:
Person person = new Person { FirstName="Scott",
LastName="Guthrie", Age=32 };
同时不需要类提供带参数的构造函数.
再如类对象嵌套初始化:
Person person = new Person {
FirstName = "Scott",
LastName = "Guthrie"
Age = 32,
Address = new Address {
Street = "One Microsoft Way",
City = "Redmond",
State = "WA",
Zip = 98052
}
};
[3]C#语言的新特性:集合初始化器(Collection Initializers)
对象初始化器很棒,它极大地简化了把对象添加到集合的做法。
譬如:
List<Person> people = new List<Person>();
people.Add( new Person { FirstName = "Scott", LastName
= "Guthrie", Age = 32 } );
people.Add( new Person { FirstName = "Bill", LastName
= "Gates", Age = 50 } );
people.Add( new Person { FirstName = "Susanne",
LastName = "Guthrie", Age = 32 } );
[4]新C#语言特性:匿名类型
[5]利用var关键词,这个新关键词在声明局部变量时可用于替代
类型名。
除了使用var这个关键词替代内置的数据类型外,很明显地,你
也可以将它用于你定义的任何自定义类型。
[6]新C#语言特性:扩展方法
比如:
string email = Request.QueryString["email"];
if ( EmailValidator.IsValid(email) ) {
DO();
}
而使用C#中的新“扩展方法”语言特性的话,则可以添加一个有
用的“IsValidEmailAddress()”方法到string类本身中去,该
方法返回当前字符串实例是否是个合法的字符串。然后我可以把
我的代码重写一下,使之更加干净,而且更具描述性,象这样:
string email = Request.QueryString["email"];
if ( email.IsValidEmailAddress() ) {
DO();
}
我们是怎么把这个新的IsValidEmailAddress()方法添加到现有
的string类里去的呢?我们是通过定义一个静态的类型,带有我
们的“IsValidEmailAddress”这个静态的方法来实现的,象下
面这样:
public static class ScottGuExtensions
{
public static bool IsValidEmailAddress(this string
s)
{
Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+
[\w-]{2,4}$");
return regex.IsMatch(s);
}
}
上面的静态方法在第一个类型是string的参数变量前有个“this
”关键词,这告诉编译器,这个特定的扩展方法应该添加到类型
为“string”的对象中去。然后在IsValidEmailAddress()方法
实现里,我可以访问调用该方法的实际string实例的所有公开属
性/方法/事件,取决于它是否是合法电子邮件地址来返回
true/false。
在我的代码里把这个特定的扩展方法的实现添加到string实例,
我只要使用标准的“using”语句来引入含有该扩展方法的实现
的命名空间:
using ScottGuExtensions;
利用扩展方法这个新特性来给个别类型添加方法给开发人员开辟
了许多有用的扩展性使用场景。但使得扩展方法非常强有力的是
,它们不仅能够应用到个别类型上,也能应用到.NET框架中任何
基类或接口上。这允许开发人员建立种种可用于整个.NET框架的
丰富的可组合的框架层扩展。
using System;
using System.Collection;
namespace YourNamespace{
public static class TestClass{
public static bool In(this object o,IEnumerable
c){
foreach(object i in c){
if(i.Equals(o))
return true;
}
return false;
}
}
}
注意上面我是如何声明扩展方法的第一个参数的:“this
object o”。这表明,这个扩展方法应该适用于继承于基类
System.Object的所有类型,这意味著我可以在.NET中的每个对
象上使用它。
上面这个“In”方法的实现允许我检查一个指定的对象是否包含
在作为方法参数传入的一个IEnumerable序列中。因为所有
的.NET集合和数组都实现了IEnumerable接口,现在我拥有了一
个有用的,描述性强的方法来检查一个任意的对象是否属于任何
.NET集合或数组。
在给类库中添加方法时,需要另外新建一个类用来建立方法.
方法中第一个参数为该方法的对象.第二参数以后的为方法自带
参数.
[7]在以往的CODING中,当使用自能提示时,发现此时也需要查看
该行代码的下面代码.而自能提示的不透明性给编码带来了麻烦.
如今VS2005中,当你在使用自能提示时,如果需要查看下面代码,
只需要按住CTRL键就可以使自能提示框透明50%.就可以清楚看到
下面是什么样的代码,以此来选择你所需要的方法或属性.