2010-09-30 3 views
1

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

+3

Что доказывать? Никакие методы экземпляра не изменяют экземпляр, поэтому тип неизменен. –

+0

Это может быть дубликат http://stackoverflow.com/questions/2365272/why-net-string-is-immutable или http://stackoverflow.com/questions/93091/why-cant-strings-be-mutable -in-java-and-net –

+6

Доказать иначе. Я думаю, что бремя доказывания на вас, так как мы не кричим. Мы продолжим использовать его, как если бы он изменился, пока не будет показано иначе :-) – paxdiablo

ответ

1

доказав это просто вопрос прохождения через каждый извне доступного элемента (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;}} 
} 

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

Строка во втором случае, кстати, хотя это деталь реализации.

0
Why string is immutable and StringBuilder is mutable ? 

строка строитель изменчиво .ie это чистая ссылка type.The следующий пример с «Foo» передается в качестве ссылочного типа .so выход 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 неизменен .В некоторых отношений это быть типами значений .Этей известны как неизменный .the следующих примера «Foo» передается это строка, но этот акт как тип значения. Таким образом, выход «hello»

например:

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:"; 
} 
} 

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

Out типа: Это же исх .The Дело в том, что изначально переменная Unassigned.

взглянуть на моем блоге: Http: http://anishmarokey.blogspot.com/2009/08/mutable-vs-immutable.html

0

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

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

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

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

+0

Это не доказательство, не так ли? –

6

Вы всегда можете проверить ECMA C# Language Specification:

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

+1

+1 RTFS - прочитайте сказочные характеристики! :-) –

+0

Это не отвечает «как», и не доказывает, что спецификация действительно соблюдается. –

2

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

Все типы значений должны наследоваться от ValueType (неявно caurse), но 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 

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

Из class System.String документации:

неизменности и класс StringBuilder

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

Смежные вопросы