Строка является неизменной ссылкой типа как ?. Докажите это ?Строка является ссылочным типом
ответ
доказав это просто вопрос прохождения через каждый извне доступного элемента (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;}}
}
Оба этих классов определяют неизменные ссылочные типы , Первый является внутренне и внешне неизменным, второй является внутренне изменчивым, но внешне неизменным, поскольку никакой метод, доступный извне, не может изменить значение любого члена экземпляра.
Строка во втором случае, кстати, хотя это деталь реализации.
Вот что-то читать о том, что: http://msdn.microsoft.com/en-us/library/362314fe.aspx
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
строка представляет собой ссылочный тип в C#. Когда мы создаем переменную типа string, в памяти создается один объект типа string. Этот объект нельзя изменить после его создания.
Если мы присвоим другое значение той же строковой переменной, новый объект будет создан в памяти, а строковая переменная указывает на этот новый адрес объекта.
Именно поэтому строка считается непреложным типом.
Как сказал Рюэль, вы можете получить дополнительную информацию о строках типа here.
Это не доказательство, не так ли? –
Вы всегда можете проверить ECMA C# Language Specification:
8.2.1 Предопределенные типы
C# предоставляет набор предопределенных типов, большинство из которых будут знакомы для разработчиков C и C++. Предопределенные ссылочные типы являются объектами и строкой. Объектом типа является конечный базовый тип всех других типов. Строка типа используется для представления Строковые значения Юникода. Значения типа Строка неизменяемы.
+1 RTFS - прочитайте сказочные характеристики! :-) –
Это не отвечает «как», и не доказывает, что спецификация действительно соблюдается. –
Докажите, что строка (если вы имеете в виду 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 , который содержит модификацию.
- 1. Является статическим булевым ссылочным типом в Swift?
- 2. jdt: Проверьте, является ли IField ссылочным типом
- 3. Является ли Static Class ссылочным типом или типом значения?
- 4. Является ли объект ссылочным типом или типом значения?
- 5. Разница между ссылочным типом и типом объекта?
- 6. Если P не является ссылочным типом: если A является ссылочным типом, ref-определитель типа A игнорируется для вывода типа
- 7. Пустой финал с ссылочным типом
- 8. Является ли строка [] не типом?
- 9. Является ли ссылочным типом в C++ тип POD?
- 10. Является ли C# динамическим POD значением или ссылочным типом?
- 11. Конфликт в том, что объект является ссылочным типом
- 12. Является ли массив аргументом в c действительно ссылочным типом?
- 13. Почему строка является ссылочным типом, но ведет себя иначе, чем другие ссылочные типы?
- 14. Может ли тип быть ссылочным типом и типом значения одновременно?
- 15. Is Guid считается типом значения или ссылочным типом?
- 16. Создание объекта с другим ссылочным типом и типом экземпляра
- 17. Как узнать, какой тип является ссылочным типом или типом значения в Visual Studio
- 18. Ошибка: тип «TEntity» должен быть ссылочным типом
- 19. Действительно запутано между объектом и ссылочным типом
- 20. C++ - экземпляр шаблона со ссылочным типом
- 21. Почему примитивы не являются ссылочным типом?
- 22. Как целочисленный массив может быть ссылочным типом?
- 23. Необязательный параметр должен быть ссылочным типом
- 24. Как сделать выражение типа выражения ссылочным типом?
- 25. «строка не является типом» в пространстве имен
- 26. C# Разница между ссылочным типом и концепцией «Mutable»?
- 27. Почему Type.IsByRef для типа String возвращает false, если String является ссылочным типом?
- 28. В C#, почему String является ссылочным типом, который ведет себя как тип значения?
- 29. Как написать единичный тест для «T должен быть ссылочным типом»?
- 30. В массиве строк C# отдельные элементы массива являются ссылочным типом или типом значения?
Что доказывать? Никакие методы экземпляра не изменяют экземпляр, поэтому тип неизменен. –
Это может быть дубликат http://stackoverflow.com/questions/2365272/why-net-string-is-immutable или http://stackoverflow.com/questions/93091/why-cant-strings-be-mutable -in-java-and-net –
Доказать иначе. Я думаю, что бремя доказывания на вас, так как мы не кричим. Мы продолжим использовать его, как если бы он изменился, пока не будет показано иначе :-) – paxdiablo