Строка является ссылочным типом - PullRequest
1 голос
/ 30 сентября 2010

String является неизменяемым ссылочным типом как ?.доказать это?

Ответы [ 6 ]

6 голосов
/ 30 сентября 2010

Вы всегда можете проверить ECMA C # Спецификация языка:

8.2.1 Предопределенные типы
C # предоставляет набор предопределенных типов, большинство из которых будут знакомы разработчикам C и C ++. предопределенные ссылочные типы являются объектами и строка Тип объекта является базовый базовый тип всех остальных типов. Строка типа используется для представления Строковые значения Юникода. Значения типа Строка неизменна .

2 голосов
/ 30 сентября 2010

Доказать, что строка (если вы имеете в виду System.String, конечно) является ссылочным типом, довольно просто.

Все типы значений должны наследоваться от ValueType (неявно caurs), но System.String наследуется непосредственно от System.Object, поэтому с подходом исключения не может быть ничего, кроме ссылочного типа.

Console.WriteLine("".GetType().BaseType); //prints System.Object
Console.WriteLine(1.GetType().BaseType); //prints System.ValueType

Чтобы проверить неизменность, вы должны найти любой "мутирующий" метод внутри класса System.String. Я не могу найти ни одного! Потому что все «мутирующие» методы фактически возвращают другой экземпляр, и вы можете легко проверить это, вызвав object.ReferenceEquals:

Console.WriteLine(object.ReferenceEquals(s, s + "1")); //False
Console.WriteLine(object.ReferenceEquals(s, s.Insert(0, "12"))); //False

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

Из Класс System.String Документация:

Неизменяемость и StringBuilder Класс

Объект String называется неизменным (только для чтения), потому что его значение не может быть изменены после того, как он был создан. Методы, которые появляются для изменения строки объект фактически возвращает новую строку объект, содержащий модификацию.

1 голос
/ 30 сентября 2010

Доказательство - это просто вопрос прохождения каждого доступного извне (public, protected, internal или protected internal) члена и определения, могут ли они мутировать объект.Ни один из них не может, следовательно, он неизменен.

Как легко:

Неизменяемость определений принудительного элемента ссылочного типа:

public class TestClass
{
  private readonly int _someValue;
  public TestClass(int val){_someValue = val;}
  public int Value{get{return _someValue;}}
}

Неизменяемость обеспечивается только интерфейсом:

public class TestClass
{
  private int _someValue;
  public TestClass(int val){_someValue = val;}
  public int Value{get{return _someValue;}}
}

Оба эти класса определяют неизменяемые ссылочные типы.Первый является как внутренним, так и внешним неизменным, второй является внутренним изменяемым, но внешним неизменным, так как ни один внешне доступный метод не может изменить значение любого элемента экземпляра.

Строка во втором случае, между прочим, случайна, хотя это реализацияподробно.

1 голос
/ 30 сентября 2010

Вот что почитать об этом: http://msdn.microsoft.com/en-us/library/362314fe.aspx

0 голосов
/ 30 сентября 2010

String является ссылочным типом в C #.Когда мы создаем переменную типа string, один объект типа string создается в памяти.Этот объект нельзя изменить после создания.

Если мы присваиваем какое-то другое значение той же строковой переменной, новый объект создается в памяти, а строковая переменная указывает на этот новый адрес объекта.

Именно поэтому строка считается неизменным типом.

Как сказал Руэль, вы можете получить больше информации о типе строки здесь .

0 голосов
/ 30 сентября 2010
Why string is immutable and StringBuilder is mutable ?

строковый построитель является изменяемым. Т.е. это чистый ссылочный тип. В следующем примере 'foo' передается как ссылочный тип. Так что вывод helloanish: Например:

class Program
{
static void Main(string[] args)
{
StringBuilder y =new StringBuilder();
y.Append("hello");

Program p = new Program();
p.foo( y);
Console.WriteLine(y );
}

void foo(StringBuilder sb)
{
sb .Append("anish:");
}
}

Stirng является неизменным. В некоторых случаях это типы значений. Они известны как неизменяемые. В следующем примере передается 'foo', это строка, но это действует как тип значения. Так что выходной результат 'hello' 1005 *

например:

class Program
{
static void Main(string[] args)
{
string y =string.Empty;
y="hello";

Program p = new Program();
p.foo( y);
Console.WriteLine(y );
}

void foo(string sb)
{
sb +="anish:";
}
}

Примечание: примечание только строка. Некоторые другие типы также.

Вместо создания нового хранилища для объявления члена функции, то же хранилище можно использовать с помощью типа ref.

Например:

class Program
{
static void Main(string[] args)
{
string y ="";
y="hello";

Program p = new Program();
p.foo(ref y);
Console.WriteLine(y );
}

void foo(ref string sb)
{
sb="anish:";
}
}

Вывод не привет, его аниш

Тип выхода: то же самое. Ссылка. Дело в том, что изначально переменная не назначена.

Загляните в мой блог: http: http://anishmarokey.blogspot.com/2009/08/mutable-vs-immutable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...