下面的代码创建了多少个字符串对象

本文关键字:多少 字符串 对象 创建 代码 | 更新日期: 2023-09-27 18:17:26

string s = "";
for(int i=0;i<10;i++) {
s = s + i;
}

我已经有了这些选项来回答这个问题。

    1
  1. 11
  2. 10
  3. 2
我有这段简单的代码,我只是想知道这段代码将创建多少个字符串对象。

我有一个疑问,是string s = "";创建没有对象。我不这么认为,请让我明白。

如果我在字符串后面加上+操作符,它会创建一个新的字符串,所以我认为它会在for循环的每次迭代中创建一个新的对象。

所以我认为将会创建11个对象。如果我错了,请告诉我。

String result = "1" + "2" + "3" + "4";  //Compiler will optimise this code to the below line.
String result = "1234"; //So in this case only 1 object will be created??

我按了下面的链接,但还是不清楚。

Link1

请把string strstring str = null也包括在内。如果我们不初始化string,当我将string赋值为null。所以在这两种情况下,它要么是对象,要么不是对象

string str;
string str = null;

后面的代码中,If I do.

str = "abc";

是否有任何编程方法来计算对象的数量?,因为我认为这可能是一个有争议的话题。我怎么能通过编程或工具做到百分百?我在IL代码中看不到这个

我尝试了下面的代码,只是为了确保是否创建了新的对象。它为每次迭代写"不同"。这意味着它总是给我一个不同的物体,所以可能有10或20个物体。因为它没有给我中间状态的信息(在做s = s + i时为i装箱)

    string s = "0";
    object obj = s;
    for (int i = 0; i < 10; i++)
    {
        s = s + i;
        if (Object.ReferenceEquals(s, obj))
        {
            Console.Write("Same");
        }
        else
        {
            Console.Write("Different");
        }
    }

我不同意string str = ""不创建任何对象的说法。我试过了。

    string s = null;
    object obj = null;
    if (Object.ReferenceEquals(s, obj))
    {
        Console.Write("Same");
    }
    else
    {
        Console.Write("Different");
    }

代码写"相同",但如果我写string s = "";,它在控制台写"不同"。

我现在还有一个疑问。

s = s + is = s + i.ToString()有什么不同?

s = s + i.ToString() IL Code

IL_000f:  call       instance string [mscorlib]System.Int32::ToString()
IL_0014:  call       string [mscorlib]System.String::Concat(string, string)

s = s + i IL Code

IL_000e:  box        [mscorlib]System.Int32
IL_0013:  call       string [mscorlib]System.String::Concat(object, object)

这里box和instance有什么区别

下面的代码创建了多少个字符串对象

我们来数数:

string s = ""; // no new objects created, s assigned to string.Empty from the cache
// 10 times:
for(int i = 0; i < 10; i++) {
  // i     <- first object to create (boxing): (object) i
  // s + i <- second object to create: string.Concat(s, (object) i);
  s = s + i;
}

测试string s = ""不创建一个额外的对象,你可以输入

string s = "";
if (object.ReferenceEquals(s, string.Empty))
  Console.Write("Empty string has been cached");

最后,我们有20对象:0 + 10 * 2 (10盒装int s和10 string s)。

string result = "1" + "2" + "3" + "4";
如您所见,

result可以并且(将)在编译时计算,因此只创建一个对象("1234")。如果

string str; // just a declaration, str contains trash
string str = null; // no objects created
...
str = "abc"; // an object ("abc") created

虽然Dmitry Bychenko的回答是正确的并且解释得很好,但是我想补充一些东西。

string s = "";
for(int i=0;i<10;i++) {
s = s + i;
}

Code会给你20个对象。没有对象将为string str = ""创建,因为引用将缓存空字符串。s = s + i;将扩展为以下IL代码,因此它保证将发生装箱并创建新对象以引用新字符串s + i

IL_000e:  box        [mscorlib]System.Int32
IL_0013:  call       string [mscorlib]System.String::Concat(object, object)

您可以使用IL反汇编器查看IL代码。