Строка типа значения или ссылочного типа?
Я просто не могу найти "хорошее" объяснение этого...
Строка типа значения или ссылочного типа?
Я просто не могу найти "хорошее" объяснение этого...
Console.WriteLine(typeof(string).IsClass); // true
Это ссылочный тип.
Это не может быть тип значения, поскольку для типов значений нужен известный размер для стека и т.д. В качестве ссылочного типа размер reference известен заранее, даже если размер строки не указан.
Он ведет себя так, как вы ожидаете, что тип значения будет вести себя, потому что он неизменен; то есть он не * изменяется после создания. Но есть много других неизменных ссылочных типов. Например, делегировать экземпляры.
* = за исключением внутри StringBuilder
, но вы никогда не увидите его, пока он делает это...
Строка является неизменным ссылочным типом.
Смотрите сообщение в блоге Неизменяемые типы: понимайте их преимущества и используйте их на неизменности.
Основополагающее "объяснение" основано на "том, что" фактически хранится в ячейке памяти, выделенной при "объявлении" переменной для вещи. Если фактическое значение вещи хранится в ячейке памяти, на которую ссылается имя переменной, то это тип значения.
int x; // memory allocated to hold Value of x, default value assigned of zero
Если otoh, слот памяти, выделенный при "объявлении" переменной, будет содержать только некоторый другой адрес памяти, в котором будет сохранено фактическое значение (или значения), то это ссылочный тип.
MyClass x; // Memory allocated to hold an address,
// default address of null (0) assigned.
// NO MEMORY ALLOCATED for x itself
или, если объявление включает инициализацию,
MyClass x = new MyClass();
// Now, Memory slot (call it Addr1) is allocated to hold address of x,
// more memory (call it Addr2) is allocated to hold a new MyClass object.
// New MyClass object created, stored in memory Addr2 (on the Heap)
// Address of new object (Addr2) is stored in Addr1
для строки, строка создается в куче, и адрес идет в слот памяти, выделенный для переменной, поэтому это ссылочный тип.
String - неизменный ссылочный тип, который обладает определенными качествами, которые придают ему случайный вид типа значения
Тип строки представляет собой последовательность из ноль или более символов Unicode. string - это псевдоним для String в .NET Framework.
Хотя строка является ссылочным типом, операторы равенства (== и! =) определены для сравнения значений строковых объектов, а не ссылок. Это делает тестирование для равенства строк более интуитивным. Например:
string a = "hello";
string b = "h";
// Append to contents of 'b'
b += "ello";
Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);
Отображается "True", а затем "False", потому что содержимое строк эквивалентно, но a и b не относятся к одному и тому же экземпляру строки.
Строки неизменяемы - содержимое строкового объекта не может быть изменено после создания объекта, хотя синтаксис делает его таким, как будто вы можете это сделать. Например, когда вы пишете этот код, компилятор фактически создает новый строковый объект для хранения новой последовательности символов, а новый объект присваивается b. Затем строка "h" имеет право на сбор мусора.
string b = "h";
b += "ello";
На многих языках существуют два общих типа вещей: те, в которых место хранения определенного типа будет фактически содержать объект этого типа, и те, в которых место хранения определенного типа будет содержать ссылку на объект такого типа, который хранится в другом месте. Есть также несколько типов семантики, которые могут предложить:
В некоторых языках программирования, таких как С++, для типов с прямым хранением и косвенной ссылкой возможно реализовать любой из указанных выше четырех типов семантики. В .net и С#, типы с прямым хранением с открытыми полями всегда реализуют # 3, типы классов с открытыми полями всегда реализуют # 4, другие типы значений могут реализовать любой из вышеперечисленных, а другие ссылочные типы могут реализовывать # 1, # 2, или # 4, но не # 3, только с незначительной аберрацией. Строки реализуют # 1.
Может быть, статья Строки в .NET и С# могут вам помочь. Согласно этой статье строка является ссылочным типом.