字符串上的ReferenceEquals

本文关键字:ReferenceEquals 字符串 | 更新日期: 2023-09-27 18:16:11

如所示这里,在运行时创建的字符串不能被拘禁。

但是,以下代码:

    class Program {
    static void Main(string[] args)
    {
        string s1 = "Programming Is Fun";
        string s3 = s1.ToString();
        Console.WriteLine(Object.ReferenceEquals(s1, s3));
    }
}

给出(VS 2015):

True

那么,它是否指定了哪些字符串是在运行时生成的?

顺便说一句:

代码:

using System;
using System.Text;
class Program {
  static void Main(string[] args)
  {
    string s1 = "hop";
    StringBuilder s2 = new StringBuilder(s1);
    string s3 = s2.ToString();
    Console.WriteLine(Object.ReferenceEquals(s1, s3));
  }
}

给出(VS 2015):

False

与mono相反。4.0.2)给出

True

字符串上的ReferenceEquals

String.ToString()返回对同一字符串的引用:

public override String ToString() {
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();
    return this;
}

和在运行时创建的字符串可以被拘禁。引用自你所引用的MSDN文章:

运行时不保证在运行时创建的字符串被存储

实习是一个开销很大的操作,通常在运行时做这个操作开销太大。如果你想确保你的字符串是被拘禁的,你可以使用public static String Intern(String str)方法。