gpt4 book ai didi

c# - 当我们在 C# 中初始化一个字符串时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:17 24 4
gpt4 key购买 nike

请看下面的程序:

static void Main()
{
string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine ( ( object ) s1 == ( object ) s2 );
Console.ReadLine();
}

此代码段的输出为“TRUE”。现在我的问题是:

  1. string s1 = "HELLO"; 是否创建了一个新的字符串对象?如果是,它如何在不调用构造函数且不使用 new 运算符的情况下创建新对象??

  2. 如果string s1 = "HELLO"string s2 = "HELLO"创建了两个对象,那么答案怎么会是TRUE??

最佳答案

如果你打算比较对象引用,那么这样做会更清楚:

Console.WriteLine ( object.ReferenceEquals(s1, s2 ));

而不是像这样:

Console.WriteLine ( ( object ) s1 == ( object ) s3 ); // false

也就是说,让我们稍微重写一下您的代码:

using System;

public class Program
{
public static void Main()
{
string s1 = "Hello";
string s2 = string2();
Console.WriteLine ( object.ReferenceEquals(s1, s2 )); // true

string s3 = "Hel";
s3 = s3 + "lo";

Console.WriteLine ( object.ReferenceEquals(s1, s3 )); // false

// This is the equivalent of the line above:
Console.WriteLine ( ( object ) s1 == ( object ) s3 ); // also false

Console.WriteLine (s1 == s3); // true (comparing string contents)

s3 = string.Intern(s3);
Console.WriteLine ( object.ReferenceEquals(s1, s3 )); // now true

Console.ReadLine();
}

private static string string2()
{
return "Hello";
}
}

好的,那么问题来了,“为什么前两个字符串具有相同的引用”?

这个问题的答案是因为编译器保留了一张表,其中包含到目前为止已存储的所有字符串,如果它遇到的新字符串已经在该表中,则不会存储新字符串;相反,它使新字符串引用其表中已有的相应字符串。这称为 string interning

接下来要注意的是,如果您通过在运行时连接两个字符串来创建新字符串,那么该新字符串与现有字符串没有相同的引用。一个全新的字符串被创建。

但是,如果您使用 == 将该字符串与另一个具有不同引用但内容相同的字符串进行比较,将返回 true。那是因为字符串 == 比较字符串的内容

上面代码中的下一行演示了这一点:

Console.WriteLine (s1, s3); // true

最后,请注意运行时可以“实习”字符串,即使用对现有字符串而不是新字符串的引用。但是,它不会自动执行此操作。

您可以调用 string.Intern() 来明确地实习一个字符串,如上面的代码所示。

关于c# - 当我们在 C# 中初始化一个字符串时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34129666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com