C#

新的C#语言特性

[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%.就可以清楚看到下面是什么样的代码,以此来选择你所需要的方法或属性.

分类: C#

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部