当前位置: 首页 > 编程语言 > C#

奇怪的字符串字面量比较分享

时间:2023-04-11 03:36:14 C#

奇怪的字符串字面量比较深入研究C#,我遇到了一个关于对象引用相等性的小(奇怪)问题。假设我有两个字符串:Stringa="Helloworld!";Stringb="Bonjourlemonde";boolequals=ReferenceEquals(a,b);//**********************(1)b="Helloworld!";equals=ReferenceEquals(a,b);//*******************(2)(1)为假,这是预期的。ReferenceEquals文档说ReferenceEquals比较实例但是:这是因为字符串实习。公共语言运行时通过维护一个称为内部池的表来维护字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字串实例在系统中只存在一次。例如,如果将相同的文字字符串分配给多个变量,运行时将从内部池中检索对文字字符串的相同引用并将其分配给每个变量。字符串文字由.NET运行时自动实现。这意味着为具有相同值的字符串文字共享相同的字符串实例。这样做是为了减少内存使用并提高性能。这是一个安全的优化,因为字符串是不可变的。您的代码编译为类似于以下内容的CIL指令:IL_0001:ldstr"Helloworld!"IL_0006:stloc.0IL_0007:ldstr"Bonjourlemonde"IL_000c:stloc.1etc...来自ECMA规范中的ldstr(“加载文字字符串”的文档)指令:默认情况下,CLI保证结果引用两个具有相同字符序列的元数据标签的两个ldstr指令返回完全相同的字符串对象(称为“字符串实习”的过程)。可以使用System.Runtime.CompilerServices.CompilationRelaxationsAttribute和System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning来控制此行为。您也可以通过调用方法String.Intern来实习自己。大多数时候,字符串字面量是同一个对象,因为它们是常量和不可变的。来自微软文档:每个字符串文字不一定会产生一个新的字符串实例。当根据字符串相等运算符(第7.9.7节)等效的两个或多个字符串文字出现在同一个程序集中时,这些字符串文字引用相同的字符串实例。例如,classTest{staticvoidMain(){objecta="hello";产生的输出对象b="你好";System.Console.WriteLine(a==b);}}是True因为两个文字引用相同的字符串实例。.NET维护一个字符串池,因为它们是不可变的。您不必关心它,因为它需要自己重用它们。以上就是《C#学习教程:奇怪的字符串字面量比较》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: