BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

另一种眼光看VB中的匿名类型

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 陈黎夫 关注 0 他的粉丝 发布于 2008年1月26日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

C#中的匿名类型非常简单,因为这些匿名类型都是不可变的。而VB却同时支持可变和不可变的匿名类型,对于这两种匿名类型,实现和使用的规则也略有不同。

不可变的匿名类型

C#和VB中的不可变匿名类型完全相同。这些匿名类型都是一些只读的属性集合,还包含有Equals、ToString、GetHashCode等方法的重载。从反编译的代码中可以看出,二者的实现存在着些许不同,不过结果却是一样的:Equals和GetHashCode方法都基于类型中的所有字段计算得出。

C#只允许我们使用不可变的匿名类型。而在VB中若想得到不可变的匿名类型,我们需要使用Select子句或者在类型中每个字段前面加上Key关键字,例如:

var a = new { Name = "Tom", Age = 25 };
[…] Select c.Name, c.Age
[…] Select New With {Key c.Name, Key c.Age}
Dim a = New With {Key .Name = "Tom", Key .Age = 25}

可变的匿名类型

相对于不可变匿名类型,VB中可变的匿名类型则简单得多。这些类型没有Equals或GetHashCode方法,因此若想比较两个对象,我们必须手工进行。可变的匿名类型也不会自动为字段生成属性的Setter。

例如:

[…] Select New With { c.Name, c.Age}
Dim b = New With { .Name = "Tom", .Age = 25}

部分可变的匿名类型

若是匿名类型中的某些(但不是全部)字段被标记为Key,那么我们就创建了一个部分可变的匿名类型。对于这种类型,标记为Key的字段是只读的,而没有标记为Key的字段则可读可写。

对于部分可变的匿名类型,使用其Equals或GetHashCode方法必须格外小心——只有标记为Key的字段将用于这两个方法中的计算,而其他可变的字段将被忽略。这样的实现有利于把可变字段放置在哈希表中,以提高查询时的效率。

例如:

[…] Select New With {Key c.Name, c.Age}
Dim c = New With {Key .Name = "Tom", .Age = 25}


查看英文原文:Another Look at Anonymous Types in VB

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT