百科问答小站 logo
百科问答小站 font logo



C# 的匿名类型为什么要限制属性为只读呢? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

基本同意

@Gee Law

的答案,

其实匿名类型是C# 3.0引入的,C# 3.0引入的所有新特性基本都是为了实现LINQ这一伟大的语言特性。

匿名类型是为了解决LINQ中选择部分字段以及多字段作为分组依据聚合或是多字段联接的问题的。

所以,说白了匿名类型设计的目标就是元组。


顺便解释一下

@Gee Law

的问题,首先,匿名对象需要做到如果两个匿名对象的属性名称、类型和值都相同,就是等同的,是有现实原因的,因为如果不满足这一点的话,下面这种LINQ将无法得到期望的结果:

       form item1 in list1 join from item2 in list 2 on new { item1.Key1, item1.Key2 } equals new { item2.Key1, item2.Key2 }     

事实上这就造成了匿名对象的所谓的值语义,但如果直接使用值类型,那么会带来一些别的问题:

首先是值类型保存在堆栈上,任何赋值操作都会导致一份拷贝,如果对象太大性能会很差。

其次值类型必然有一个无参的构造函数,这使得在一些奇怪的代码下我们可以调用匿名类型的这个无参构造函数搞出一个莫名奇妙的实例:

       public T M<T>() where T : new() {   return new T(); }  public T M<T>() {   return default(T); }      

总之,我觉得这个问题的根本还是在于,匿名类型本质上就是关系模型中的元组在C#里面的映射。元组显然是不可变的,匿名类型也没有必要设计成可变的来自找麻烦。


user avatar   geelaw 网友的相关建议: 
      

因为不变对象自带线程安全。而且实际上 Linq 出来的东西你也改不了,除非你改数据源或者 ToArray 之类的再改。


另外不变性造就了值语义,因为它是不变对象,所以

new { Name = "Gee" } == new { Name = "G" + "ee" }

是 true,否则它应该是 false。以及值语义下的 GetHashCode 重写。

至于为什么不让它本身就是结构而是类,我不太清楚。




  

相关话题

  如果让你重新开始学计算机,你的学习路线会是怎么选择? 
  为什么国外一些常见问答网站的地址栏中常常就给出了问题题目,相对于像国内一样使用ID来标记而言好在哪里? 
  有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? 
  亲爱的程序员们,一天写多少代码才算达标? 
  设计 MySQL 数据表的时候一般都有一列为自增 ID,这样设计原因是什么,有什么好处? 
  C# 的扩展方法是否是一个糟糕的设计? 
  c#入门书籍有推荐吗? 
  高中生羡慕这种美国生活怎么办? 
  编程的时候 命名 方法或变量 词穷了怎么办? 
  用计算器打 CS,实际上真的可以实现吗? 

前一个讨论
物价高是因为物品稀缺吗?
下一个讨论
怎么理解下面这句话,这和中国文明有啥关系?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利