我知道这可能听起来像一个奇怪的问题,但这已经在我脑海中持续了一段时间。
我知道C#中的System.String类型实际上是一个带有构造函数的类,该构造函数具有字符数组参数。例如,以下代码是合法的,不会导致错误:
System.String s = new System.String("Hello".toCharArray());
我的问题是,System.String类可以通过这种方式接受一个字符数组:
System.String s = "Hello";
答案 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"