Ответ 1
. Framework.Net требует, чтобы строки были неизменными. Благодаря этому требованию он может оптимизировать все виды операций.
Интерпретация строк - один из величайших примеров этого требования, сильно зависит от него. Чтобы ускорить сравнение строк (и уменьшить потребление памяти),.NET Framework поддерживает словарь указателей, все предварительно определенные строки будут жить в этом словаре или в любых строках, где вы вызываете метод String.intern
. Когда вызывается команда ldstr IL, она проверяет интернированный словарь и избегает выделения памяти, если у нас уже есть выделенная строка, обратите внимание: String.Concat будет не проверять интернированные строки.
Это свойство инфраструктуры .net означает, что если вы начнете трахаться напрямую со строками, вы можете повредить свою старую таблицу и, в свою очередь, повредить другие ссылки на одну и ту же строку.
Например:
// these strings get interned
string hello = "hello";
string hello2 = "hello";
string helloworld, helloworld2;
helloworld = hello;
helloworld += " world";
helloworld2 = hello;
helloworld2 += " world";
unsafe
{
// very bad, this changes an interned string which affects
// all app domains.
fixed (char* str = hello2)
{
*str = 'X';
}
fixed (char* str = helloworld2)
{
*str = 'X';
}
}
Console.WriteLine("hello = {0} , hello2 = {1}", hello, hello2);
// output: hello = Xello , hello2 = Xello
Console.WriteLine("helloworld = {0} , helloworld2 = {1}", helloworld, helloworld2);
// output : helloworld = hello world , helloworld2 = Xello world