Если вы компилируете их в коде .. они являются константами времени компиляции .. то есть код явно ссылается на них из вашего скомпилированного двоичного файла, который, конечно же, загружается в память во время выполнения.
Если вы построите их во время выполнения .. как из массива char, я бы предположил, что для этого CLR необходима реализация. Например - посмотреть на следующий код из http://referencesource.microsoft.com/#mscorlib/system/string.cs,97ccd50b20126543
[System.Security.SecuritySafeCritical] // auto-generated
private static String ConcatArray(String[] values, int totalLength) {
String result = FastAllocateString(totalLength);
int currPos=0;
for (int i=0; i<values.Length; i++) {
Contract.Assert((currPos <= totalLength - values[i].Length),
"[String.ConcatArray](currPos <= totalLength - values[i].Length)");
FillStringChecked(result, currPos, values[i]);
currPos+=values[i].Length;
}
return result;
}
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal extern static String FastAllocateString(int length);
По сути строки получить специальную обработку на языке, и хотя они являются объектами (неизменные), вы правы в своем понимании того, что они не реализованным с new
оператором в традиционном смысл. т. е. вы не делаете то, что сказали в своем комментарии String s=new String("Hello World");
, потому что если вы думаете об этом, то new
является избыточным, потому что вы уже определили свою строку в двойных кавычках как строковый литерал.
И, следовательно, в то время как вы могли бы использовать оператор неявного, чтобы преобразовать строку в заданный тип .. Это неже трюк. Трюк в случае строк - это встроенная поддержка CLR.
EDIT: Вот еще одно доказательство. Существует специальный IL OpCode для загрузки строк. OpCodes.Ldstr
«Отбрасывает ссылку на новый объект на строковый литерал, хранящийся в метаданных».
Если вы посмотрите на свой скомпилированный код, вы увидите код операции ldstr
, который будет использоваться для загрузки строк, а не newobj
opcode.
aliase и объекты - это две разные вещи. – Codeek
Я знаю, но как инициализируется объект String? –
Как вы думаете, это будет работать для других типов? –