连载,LINQ兵法十四章,4(1of2)

hi20140509 2014-05-12 09:08:18
加精
上一篇

第四章 C#的新特性

这一章我们来学习C# 2.0~C# 4.0中的一些新特性

大多数的开发者学过Java和C++,或者看着老旧的C#教材自学了C#。这里着重介绍一些C#的新语法,很多也是别的语言没有的。使用这些语法,可以写出优雅、简洁和现代的C#代码,事倍功半。因为本文不打算写成语法教程,所以更多例子可以根据关键字在MSDN或者别的教材中进一步找到详细的说明。

(1)自动属性

大家知道C#支持属性,很多人这么写:
class A
{
private int id;

public int ID
{
get
{
return id;
}
set
{
id = value;
}
}
}


如果你并不需要给ID属性增加别的代码,比如在set中检查value的合法性。那么在C# 3.0中,你可以简化为:

class A
{
public int ID { get; set; }
}


C#编译器会自动增加一个私有变量来取代私有变量id的角色,这个变量微软叫它后备字段。

(2)对象初始化器

假使我们有这样的类:
class A
{
public int ID { get; set; }
public string Name { get; set; }
}


你现在要定义一个对象,并且给属性赋值,你会怎么写?

是不是这样:
A a = new A();
a.ID = 1;
a.Name = "a";


也有人为了写在一行,定义一个构造函数:

class A
{
public int ID { get; set; }
public string Name { get; set; }

public A(int id, string name)
{
ID = id;
Name = name;
}
}


调用:
A a = new A(1, "a");


在C# 3.0中,我们有简单的写法:

我们不需要定义那个构造函数,直接写:
A a = new A() { ID = 1, Name = "a" };


顺便透露一个秘密,现在C#还不支持在对象初始化器中初始化委托和事件,不过很有可能,下一版C#会增加这个特性。

(3)var和类型推断

int i = 1;


你可以写成

var i = 1;


两者是等价的。这是因为C#编译器可以自动根据i = 1推断出i是object类型。

注意,var只是简写,它产生和你写明具体类型一样的目标代码。很多语言,比如js也有var,但是两者有本质的区别。因为var只是类型推定,所以一旦一个变量确定了类型,即便是var,也不能改变,比如

var i = 1;
i = "a";


这是不可以的。

为什么不可以?如果你明白它等价

int i = 1;
i = "a";


而这显然是不合法的,那么就不难理解了。

前面说了,
object i = 1;
i = "a";


这是可以的。但是此时i是object类型。而使用var,编译器会推定出尽可能确定的类型。

使用var对于那些很复杂的类型来说,写起来省事多了,比如
IEnumerable<Dictionary<int, Tuple<int, int, Func<int, int, bool>>>> a = foo();

写得足以让你吐血,有时候我们不怎么关心a究竟是什么类型,我是说看你代码的人。那么你可以写成
var a = foo();


编译器会根据foo()的返回值来推定类型。

还有下面的场合,var则是必不可少的了。

(4)匿名类型

在2中,我们定义了一个对象A,它包括两个字段。但是也许我们只在当前函数中需要用到它,那么定义一个类型都是多余。我们甚至不用定义它,直接这么写:

看清楚了,我们不再定义class A,你可以把定义它的代码删除,直接写下面一行:
static void Main(string[] args)
{
var a = new { ID = 1, Name = "a" };
}


我们可以读取里面的属性:
Console.WriteLine(a.ID);


匿名类型就只能用var定义了,因为根本没有类型名,你没办法写出来。其实匿名类型是有名字的,只是它的类型是由编译器自动产生的,对程序员透明而已。

需要说明两点,一个是,匿名类型是只读的,你不能写:
a.ID = 2;

试图改变它。

同时,相同属性名(区分大小写)、属性类型、属性个数、定义顺序的匿名类型的对象类型相同。

验证下:
var a = new { ID = 1, Name = "a" };
var b = new { ID = 2, Name = "b" };
Console.WriteLine(a.GetType() == b.GetType());


结果是True。

有时候,我们会这么写:

int ID = 1;
string Name = "a";
var person = new { ID = ID, Name = Name };


此时我们还可以简写:

var person = new { ID, Name };


下一篇
...全文
1242 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
挑粪编码员 2014-06-24
  • 打赏
  • 举报
回复
额。。貌似。。多看看书还是有好处的吧。虽然我都知道,但是 还是感谢LZ分享
凹加凸等于啥 2014-06-24
  • 打赏
  • 举报
回复
感谢分享
joyhen 2014-05-21
  • 打赏
  • 举报
回复
顶,写的非常好,一直关注
江湖的传说 2014-05-21
  • 打赏
  • 举报
回复
写的不错,学习了
u014262496 2014-05-20
  • 打赏
  • 举报
回复
wind_cloud2011 2014-05-15
  • 打赏
  • 举报
回复
写得真好!
xiaoyaoju 2014-05-15
  • 打赏
  • 举报
回复
学习一下
HarmonyChang 2014-05-15
  • 打赏
  • 举报
回复
谢谢楼主分享
  • 打赏
  • 举报
回复
欢乐的小猪 2014-05-13
  • 打赏
  • 举报
回复
太崇拜你了。。
yqb_last 2014-05-13
  • 打赏
  • 举报
回复
看看啊
___紫菜 2014-05-13
  • 打赏
  • 举报
回复
太崇拜你了。。。
Jonly 2014-05-13
  • 打赏
  • 举报
回复
iceMung 2014-05-13
  • 打赏
  • 举报
回复
楼主,你要火!你造吗?!
猴头 2014-05-13
  • 打赏
  • 举报
回复
这个 不错
laoer_2002 2014-05-13
  • 打赏
  • 举报
回复
谢谢楼主分享
_小黑_ 2014-05-13
  • 打赏
  • 举报
回复
写的不错 支持

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧