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

为什么ReferenceEquals(s1,s2)返回true分享

时间:2023-04-10 18:10:14 C#

为什么ReferenceEquals(s1,s2)返回trueStrings1="Hello";Strings2="你好";这里s1,s2是不同的,但为什么ReferenceEquals()返回true这是由于实习——CLI自动重新使用作为文字获得的字符串(即直接从源代码中获取的字符串)。请注意,如果您这样做:char[]chars={'h','e','l','l','o'};字符串s1=新字符串(字符);字符串s2=新字符串(字符);它们不是同一个字符串实例,因为它们不是来自文字。这是为LdstrIL指令记录的:公共语言基础结构(CLI)保证引用两个具有相同字符序列的元数据标签的两个ldstr指令的结果返回完全相同的字符串对象(称为“字符串实习”过程的)。字符串在内存中创建后是不可变的,随后相同的String对象被引用到先前创建的String对象以获取更多信息http://msdn.microsoft.com/en-us/library/362314fe。aspx字符串是不可变的,因此对相同的值使用相同的引用另请参阅Ericlippert博客了解所有相关信息您还可以使用String.Copy(Stringstr)静态方法创建一个将成为不同对象的字符串Strings1="你好”;Strings2=string.Copy("你好");那么s1和s2将引用不同的对象。如果你用谷歌搜索“ReferenceEqualsstring”,你会得到这个如果链接失效,以下是链接中接受的答案在这个例子中,“obj1”和“obj2”是不同的实例,对吧?否——string是引用类型,obj1和obj2是指向同一个实例的两个变量,部分是因为实际内容;基本上,程序集*中的任何字符串文字都可以共享相同的字符串引用。这是可能的,因为字符串是不可变的。您还可以检查实习字符串(string.IsInterned)并在必要时手动实习(string.Intern)。当两个字符串具有相同的值时,它们是否共享同一个实例?他们可能有相同的实例;但不能保证。动态生成的字符串通常不会具体化;例如,这里唯一的共享引用是2和4:stringtmp1="aa",tmp2="aaa";strings1=newstring('a',5),s2="aaaaa",s3=tmp1+tmp2,s4="aaaaa";Console.WriteLine(ReferenceEquals(s1,s2));Console.WriteLine(ReferenceEquals(s1,s3));Console.WriteLine(ReferenceEquals(s1,s4));Console.WriteLine(ReferenceEquals(s2,s3));Console.WriteLine(ReferenceEquals(s2,s4));Console.WriteLine(ReferenceEquals(s3,s4));*=strict:net-module以上是C#学习教程:为什么ReferenceEquals(s1,s2)返回true分享的所有内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多采纳更多的关注它。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: