ToString如何处理匿名类型?我搞乱了匿名类型,我不小心在控制台上输出了它。看起来这基本上就是我定义它的方式。这是一个重现它的简短程序:usingSystem;类程序{publicstaticvoidMain(string[]args){intInteger=2;DateTimeDateTime=DateTime.Now;Console.WriteLine(new{Test=0,Integer,s=DateTime});控制台.ReadKey(true);现在,输出是:{Test=0,Integer=2,s=28/05/201315:07:19}我尝试使用dotPeek进入汇编找出原因,但没有任何帮助。[1]这是dotPeek的代码://Type:Program//Assembly:MyProjectName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null//Assemblylocation:不告诉你!:P使用系统;内部类程序{publicstaticvoidMain(string[]args){Console.WriteLine((object)new{Test=0,Integer=2,s=DateTime.Now});控制台.ReadKey(true);所以没什么太大的区别。那么它是怎样工作的?它是如何输出的?注意:[1]:我忘记打开“显示编译器生成的代码”,这就是我不明白它是如何工作的原因。只是为了向HuorSwords答案添加一些代码,编译器将为您的示例生成一个ToString方法,如下所示:stringBuilder.Append("{测试=");stringBuilder.Append((object)this.__Field);stringBuilder.Append(",Integer=");stringBuilder.Append((object)this.__Field);stringBuilder.Append(",s=");stringBuilder.Append((对象)this.__Field);stringBuilder.Append("}");返回((对象)stringBuilder).ToString();当您在编译时拥有所有必需的元数据时,在这里使用反射将是高效的。使用dotPeek反编译,这个版本可能会根据使用的反编译器而有所不同。注意:由于您还使用dotPeek进行反编译,请尝试查看根命名空间。在那里你会发现类似这样的东西:[DebuggerDisplay("\{Test={Test},Integer={Integer},s={s}}",Type="")]internalsealedclass__AnonymousType0ThisiscompiledanonymousobjectTheexample编译时生成。使用匿名对象...编译器生成一个模拟匿名类型的内部密封类。匿名类型是不可变的;所有属性都是只读的。此类包含实现值语义的Equals()和GetHashCode()的覆盖。此外,编译器会为ToString()生成重写,显示每个公共属性的值。资料来源:链接请查看@IlyaIvanov的回答以查看有关此主题的一些代码。匿名类型仍然是完全定义的类型……简单地说:编译器完全自行生成它们,您永远看不到名称/实现(只是:它与您在代码中使用的初始化器相匹配)。实际上,具体操作中关于匿名类型的ToString(§7.6.10.6)并没有提及;只有Equals和GetHashCode需要处理属性。规范中的示例(“声明匿名类型的表单”)不包括ToString覆盖。MS编译器出于礼貌添加了ToString的基于属性的实现-但可能是因为默认的ToString是一个类型名称,它本身没有意义(毕竟,它是匿名的-类型名称读起来真的很糟糕),并且包括泛型语法)。坦率地说,将其仅用于调试目的是个好主意。以上是C#学习教程:ToString如何作用于匿名类型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
