C#中的System.String类型

时间:2013-12-12 16:00:46

标签: c# clr

我知道这可能听起来像一个奇怪的问题,但这已经在我脑海中持续了一段时间。

我知道C#中的System.String类型实际上是一个带有构造函数的类,该构造函数具有字符数组参数。例如,以下代码是合法的,不会导致错误:

System.String s = new System.String("Hello".toCharArray());

我的问题是,System.String类可以通过这种方式接受一个字符数组:

System.String s = "Hello";

3 个答案:

答案 0 :(得分:8)

致电时:

System.String s = new System.String("Hello".toCharArray());

您正在显式调用构造函数

当你写:

string foo = "bar";

IL指令(Ldstr)将新对象引用推送到该字符串文字。它与调用构造函数不同。

答案 1 :(得分:3)

这是可能的,因为C# language指定了字符串文字是可能的(参见§2.4.4.5字符串文字)。 C#编译器和CIL / CLR对这些文字的使用方式有很好的支持,例如:使用ldstr操作码。

不支持将这些文字包含在您自己的自定义类型中。

答案 2 :(得分:-2)

字符串是一种特殊的clr类型。它们是唯一不可变的引用类型。

以下几点可以帮助您理解字符串类型:

 var a = "Hello";
 var b = new String("Hello".ToCharArray());
 var c = String.Intern(b); // 'interns' the string...
 var equalsString = a == b;  // true
 var equalsObj =    (object)a == (object)b; // false
 var equalsInterned =    (object)a == (object)c; // true !!

 a[0] = 't'; // not valid, because a string is immutable. Instead, do it this way:
 var array = b.ToArray();
 array[0] = 't';
 a = new String(array); // a is now "tello"