Неизменяемая переменная и неизменный объект

В чем разница между неизменным объектом и неизменной переменной? они оба неизменны?

Неизменяемые переменные - это переменные, которые вообще не могут изменяться. но для простых типов есть другое имя или термин для неизменяемой переменной? Можем ли мы использовать "только для чтения" или есть определенный термин для этого?

2 ответа

В чем разница между неизменным объектом и неизменной переменной?

Неизменяемый объект - это объект, значение которого (то есть значения его свойств) не может измениться ни с помощью внешних методов доступа, ни с помощью внутренних методов.

Есть ли в C# "неизменяемые переменные"?

Если вы считаете членов класса "переменными", тогда да. Если нет, то в C++ есть понятие "постоянных" локальных переменных, а в C# нет.

для простых типов есть другое имя или термин для неизменяемой переменной?

Не в смысле "локальной переменной". В C# есть два типа членов класса, которые не могут измениться. Один readonly, который может быть установлен во время выполнения как часть конструкции объекта (или статическая конструкция для static redaonly поле).

Другой constant, который похож на readonly, но значение константы запекается в двоичном коде класса, что означает, что при каждом обращении к полю значение подставляется в скомпилированный код.

Неизменяемый объект - это объект, который нельзя изменить (ожидая, что вы получите тот же объект обратно). Это может немного сбивать с толку, поэтому позвольте мне объяснить один из самых простых примеров, которые я могу придумать. Скажем, у меня есть следующий код:

string myString = "Hello World!";

Строки являются примером неизменяемых объектов. Теперь, очевидно, вы можете изменить значение myString Однако вы не просто вносите изменения в myString возражать, когда вы делаете это. Язык фактически создает новый строковый объект, который myString будет указывать на. (Я не могу вспомнить точные детали того, как это работает, по этой причине см. Этот ответ)

//This is creating a new string object, although it looks like a simple
//manipulation of what currently exists.
myString = "Goodbye World!";  

Неизменяемые переменные (как вы их называете), с другой стороны (в моем опыте называемые " константами " или " постоянными полями "), НЕ МОГУТ изменяться. Ваш компилятор будет жаловаться, если вы попытаетесь изменить его каким-либо образом. Есть много причин, почему вы хотите это сделать (поиск в Google даст вам десятки). Короче говоря, установите константу поля, в которой вы знаете, что значение никогда и никогда не должно изменяться, даже если случайно.

Это может быть слабым примером, но скажем, у вас есть программа, которая создает Vehicle объект, и вы знаете, что больше всего колес вам понадобится 18. Вы можете сказать:

const int MAX_WHEELS = 18;

И это никогда не может измениться случайно. Каждый раз, когда вы используете MAX_WHEELS, всегда будет 18. Я не знаю деталей, но, вероятно, компилятор просто подставит значение для имени поля, но, возможно, кто-то может исправить меня в этом.

Другие вопросы по тегам