внутренняя предназначена для области сборки (т. Е. Доступна только из кода в том же .exe или .dll)
private предназначена для области действия класса (т. Е. Доступна только из кода в том же классе).
Console.WriteLine(typeof(string).IsClass); // true
Это ссылочный тип.
Это не может быть тип-значение, поскольку для типов-значений требуется известный размер стека и т. Д. В качестве ссылочного типа размер ссылка известна заранее, даже если размер строки неизвестен.
Он ведет себя так, как вы ожидаете, что тип значения будет вести себя, потому что он неизменяемый; т.е. он * не изменяется после создания. Но есть много других неизменяемых ссылочных типов. Экземпляры делегата, например.
* = за исключением внутри 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
для строки, строка создается в куче, и ее адрес помещается в слот памяти, выделенный для переменной, так что это ссылочный тип.
Строка - это неизменяемый ссылочный тип, обладающий определенными качествами, которые иногда придают ему вид значения типа
Возможно, вам поможет статья Строки в .NET и C # . Согласно этой статье, строка является ссылочным типом.