我知道这可能听起来像一个奇怪的问题,但这已经在我的脑海中存在了一段时间。
我知道 C# 中的 System.String 类型实际上是一个具有字符数组参数的构造函数的类。例如,以下代码是合法的且不会引起错误:
System.String s = new System.String("Hello".toCharArray());
我的问题是,是什么让System.String类能够以这种简单的方式接受一个字符数组:
System.String s = "Hello";
当您进行电话呼叫时:
System.String s = new System.String("Hello".toCharArray());
您正在显式调用构造函数
当您编写以下代码时:
string foo = "bar";
IL指令(Ldstr)会将一个新的对象引用推入该字符串文字。这并不相当于调用构造函数。
字符串是一种特殊的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"
public class Foo {}
- Servy
Nullable<T>
、扩展方法等一样。 - Adam Houldsworthif
语句或var
关键字一样。这只是语言的工作方式,string
是一个特殊情况,以便更容易使用。 - Jeroen Vannevel