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

внутренняя предназначена для области сборки (т. Е. Доступна только из кода в том же .exe или .dll)

private предназначена для области действия класса (т. Е. Доступна только из кода в том же классе).

49
задан Peter Mortensen 13 April 2015 в 22:36
поделиться

6 ответов

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

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

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

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

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

93
ответ дан 7 November 2019 в 11:21
поделиться

Строка - это неизменяемый ссылочный тип.

См. сообщение в блоге Неизменяемые типы: поймите их преимущества и используйте их в отношении неизменности.

17
ответ дан 7 November 2019 в 11:21
поделиться

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

   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

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

11
ответ дан 7 November 2019 в 11:21
поделиться

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

5
ответ дан 7 November 2019 в 11:21
поделиться

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

2
ответ дан 7 November 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: