какую языковую функцию используют строки, чтобы сохранить их неизменяемыми?
Это не языковая функция. Это способ определения класса.
Например,
class Integer {
private readonly int value;
public int Value { get { return this.value; } }
public Integer(int value) { this.value = value; } }
public Integer Add(Integer other) {
return new Integer(this.value + other.value);
}
}
похож на int
, за исключением того, что это ссылочный тип, но он неизменный. Мы определили так и должно быть. Мы также можем определить его как изменчивый:
class MutableInteger {
private int value;
public int Value { get { return this.value; } }
public MutableInteger(int value) { this.value = value; } }
public MutableInteger Add(MutableInteger other) {
this.value = this.value + other.value;
return this;
}
}
См
Я не понимаю, какая языковая функция делает копию valueA
, когда я присваиваю ее valueB
.
Он не копирует string
, он копирует ссылку. string
s являются ссылочными типами. Это означает, что переменные типа string
s являются местами хранения, значения которых являются ссылками. В этом случае их значения являются ссылками на экземпляры string
. Когда вы присваиваете переменную типа string
другому типу string
, значение копируется. В этом случае значение является ссылкой, и оно копируется назначением. Это верно для любого ссылочного типа, а не только для string
или только для неизменяемых ссылочных типов.
Или, возможно, ссылка на valueA
не меняется, когда я назначаю ее valueB
, только valueA
получает новую ссылку на себя, когда я задаю строку.
Нет, значения valueA
и valueB
относятся к одному и тому же экземпляру string
. Их значения являются ссылками, и эти значения равны. Если бы вы могли каким-то образом мутировать * экземпляр string
, на который ссылается valueA
, референт как valueA
, так и valueB
увидел бы эту мутацию.
Поскольку это тип экземпляра, я не понимаю, почему это работает.
Нет такой вещи как тип экземпляра.
В основном, string
являются ссылочными типами. Но string
неизменны. Когда вы изменяете string
, получается, что вы получаете ссылку на новую строку, которая является результатом мутации в уже существующем string
.
string s = "hello, world!";
string t = s;
string u = s.ToUpper();
Здесь s
и t
- переменные, значения которых относятся к одному и тому же экземпляру string
. Референт s
не видоизменяется при вызове String.ToUpper
. Вместо этого s.ToUpper
создает мутацию референта s
и возвращает ссылку на новый экземпляр string
, который он создает в процессе применения мутации. Мы присваиваем эту ссылку u
.
Я понимаю, что вы можете перегружать, например, операторы == и! =, Но я не могу найти никакой документации по перегрузке операторов =.
Вы не можете перегрузить =
.
* Можно с некоторыми хитростями. Игнорировать их.