visualbasic:C#和Visual Basic渐行渐远的匿名类型

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

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

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

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

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

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

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

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

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

Tags:  visualbasic2008 visualbasic.net visualbasic6.0 visualbasic

延伸阅读

最新评论

发表评论