Является ли строка типом значения или ссылочным типом? - программирование
Подтвердить что ты не робот

Является ли строка типом значения или ссылочным типом?

Строка типа значения или ссылочного типа?

Я просто не могу найти "хорошее" объяснение этого...

4b9b3361

Ответ 1

Console.WriteLine(typeof(string).IsClass); // true

Это ссылочный тип.

Это не может быть тип значения, поскольку для типов значений нужен известный размер для стека и т.д. В качестве ссылочного типа размер reference известен заранее, даже если размер строки не указан.

Он ведет себя так, как вы ожидаете, что тип значения будет вести себя, потому что он неизменен; то есть он не * изменяется после создания. Но есть много других неизменных ссылочных типов. Например, делегировать экземпляры.

* = за исключением внутри StringBuilder, но вы никогда не увидите его, пока он делает это...

Ответ 4

Основополагающее "объяснение" основано на "том, что" фактически хранится в ячейке памяти, выделенной при "объявлении" переменной для вещи. Если фактическое значение вещи хранится в ячейке памяти, на которую ссылается имя переменной, то это тип значения.

   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

для строки, строка создается в куче, и адрес идет в слот памяти, выделенный для переменной, поэтому это ссылочный тип.

Ответ 5

String - неизменный ссылочный тип, который обладает определенными качествами, которые придают ему случайный вид типа значения

Ответ 6

Тип строки представляет собой последовательность из ноль или более символов 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";

Ответ 7

На многих языках существуют два общих типа вещей: те, в которых место хранения определенного типа будет фактически содержать объект этого типа, и те, в которых место хранения определенного типа будет содержать ссылку на объект такого типа, который хранится в другом месте. Есть также несколько типов семантики, которые могут предложить:

  • Семантика неизменяемого значения: экземпляры определенного типа имеют некоторую характеристику ( "значение" ), которая составляет основу идентичности. Два элемента, значение которых равно, могут использоваться взаимозаменяемо, независимо от того, где они хранятся. Значение будет постоянным, если экземпляр существует. Переменная такого типа может изменить свое значение, но только путем хранения другого экземпляра в переменной.
  • Неизбежная ссылочная семантика: в целом аналогична семантике неизменяемости, за исключением того, что два экземпляра, которые были созданы в разное время, будут сообщаться как разные экземпляры.
  • Семантика взаимозаменяемости: экземпляры определенного типа имеют некоторую характеристику или набор характеристик ( "значений" ), которые составляют основу идентичности, но эти характеристики могут быть изменены без замены всего экземпляра. Каждый экземпляр хранится в одной переменной или поле; копирование одной переменной или поля в другую копирует все значения от одного первого экземпляра ко второму, но экземпляры остаются отдельными. Будущие изменения одного экземпляра не повлияют на другие.
  • Изменчивая ссылочная семантика: каждый экземпляр идентичен самому себе, но никому другому сущности, а экземпляры имеют одно или несколько значений, которые могут быть изменены в существующих экземплярах. Любое количество переменных или полей может содержать ссылку на любой экземпляр. Копирование одной или полевой переменной в другую просто делает вторую ссылку на тот же экземпляр, что и первый. Следовательно, любое изменение экземпляра, на которое ссылается одна из переменных, будет влиять на экземпляр, на который ссылается другой (т.е. Тот же самый экземпляр).

В некоторых языках программирования, таких как С++, для типов с прямым хранением и косвенной ссылкой возможно реализовать любой из указанных выше четырех типов семантики. В .net и С#, типы с прямым хранением с открытыми полями всегда реализуют # 3, типы классов с открытыми полями всегда реализуют # 4, другие типы значений могут реализовать любой из вышеперечисленных, а другие ссылочные типы могут реализовывать # 1, # 2, или # 4, но не # 3, только с незначительной аберрацией. Строки реализуют # 1.

Ответ 8

Может быть, статья Строки в .NET и С# могут вам помочь. Согласно этой статье строка является ссылочным типом.