写点什么

C#和 Visual Basic 渐行渐远

  • 2007-05-15
  • 本文字数:873 字

    阅读完需:约 3 分钟

在 VB.NET 和 C#第一次被发布时,很多人认为它们只是在语法和一些小的方面不一样的相同语言而已。但随着时间的推移,它们(C#和 VB)之间的不同越来越明显,比如对匿名类型(Anonymous Type)的处理就有着天壤之别。

为了支持类似哈希表的数据结构和像分组这样的查询操作,由 LINQ 创建的匿名类型必须提供稳定的哈希码。而哈希码通常是由对象里的字段(Field)来创建的。

早期的匿名类型版本是不稳定的。换句话说,对象所包含的值可能会改变。而改变那些值的同时也改变了哈希码,然后会破坏一些哈希表或者恰好储存了对象的字典。

C#团队使得匿名类型稳定下来。如果对象不能被改变,那么哈希码也永远不变。通常这些稳定的类型规则被放在非默认的构造器(Constructor)和只有 Getter 的属性(Property)里。

而 VB 团队却不想放弃修改匿名类的功能。Paul Vick 这样写到:

尽管是有这样的问题存在,我们不想在泼水的时候把孩子也扔掉。现在匿名类型某种程度上是受限的,因为它们不能被命名,但是将来你可以用绑定来应用它们,甚至在它们被声明的上下文(Context)外面。现在我们在努力的一些新特性,比如有名字的匿名类型(Nominal Anonymous Type)和动态接口,将来会使匿名类型更加有用。本身而言,要使匿名类型稳定下来是不可想象的,特别是因为这会导致只有一条险径可走——也就是一旦它们稳定了,在未来的某个时候,兼容性会使它想要再不稳定变得异常困难,如果它们想要这么做的话。

VB 团队选择了一个相对复杂的方案,但这会给开发者更多的灵活性。当创建匿名类型时,程序员可以用关键词“Key”表示哪些字段是稳定的。另外要使属性只读的话,哈希码函数会只用那些 Key 字段产生哈希码。结果就是哈希码保证是稳定的。而且在被条件子句(Clause)用在联合(Join)和分组(Group)里时,字段可以被编译器自动地标识成 Key。

VB 和 C#之所以能不同的实现方式是因为匿名类型是一个编译器特性。CLR 自己对匿名类型没有什么概念,只是把它们看作有着自动产生名字的普通类。

和 VB 其他的语法一样,这个功能在 Orcas Beta 2 版本中才会提供。

查看英文原文: C# and VB Continue to Diverge

2007-05-15 19:381333

评论

发布
暂无评论
发现更多内容

迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB

极客天地

KDD 2024 | 专业实力再获认可!网易伏羲四篇论文入选

网易伏羲

人工智能 论文 KDD 网易伏羲

百度二面,有点小激动!附面试题

王磊

Java

一文读懂Lumoz节点的潜力与收益,加密收益新范式

加密眼界

高性能网络SIG月度动态:自研 IPPROTO_SMC 贡献 Linux 社区,virtio 增加多项优化

OpenAnolis小助手

高性能网络 龙蜥社区 龙蜥社区SIG

Leangoo一站式敏捷研发协同平台,助力敏捷企业高效协同

顿顿顿

敏捷开发 敏捷工具 scrum工具

mac单机游戏推荐:星际争霸母巢之战 for Mac v1.16.1汉化版

你的猪会飞吗

Mac游戏下载 Mac游戏推荐

软件测试学习笔记丨测试体系与测试方案设计

测试人

软件测试 测试开发

开始报名啦!智能可观测运维技术 MeetUp 议题硬核来袭

OpenAnolis小助手

操作系统 系统运维 可观测运维技术

Telegram的强大社交属性下TON链项目的潜力及开发前景

区块链软件开发推广运营

dapp开发 区块链开发 NFT开发 公链开发

Lightroom Classic 2020 for mac/win (lrC 2020) 中文直装版

你的猪会飞吗

Mac电脑软件 苹果电脑软件下载

软件测试学习笔记丨redis的穿透、击穿、雪崩有什么不同点?

测试人

redis 软件测试 测试开发

晶澳太阳能选择 TDengine 加强数据管理,助力实现双碳目标

TDengine

数据库 tdengine 时序数据库

Apache Paimon统一大数据湖存储底座

Apache Flink

大数据 flink 流批一体 paimon

长文本创作者福音来了,百度文库新产品「橙篇」一口气生成10万字

极客天地

Flutter中的异步和多进程

凌宇之蓝

C#和Visual Basic渐行渐远_.NET_Jonathan Allen_InfoQ精选文章