Во-первых:
Какова цель возврата нового объекта каждый раз, когда вы хотите изменить значение?
Я думаю, вы можете ошибаться в том, как работают типы значений. Это не какая-то дорогостоящая операция, как вы можете себе представить; это просто перезапись данных (в отличие, например, от динамического выделения новой памяти).
Во-вторых: вот очень простой пример того, почему числа неизменны:
5.Increase(1);
Console.WriteLine(5); // What should happen here?
Правда, это надуманный пример. Итак, давайте рассмотрим еще пару интересных идей.
Изменяемый ссылочный тип
Во-первых, вот что: что, если бы Integer
был изменяемым ссылочным типом?
class Integer
{
public int Value;
}
Тогда у нас может быть такой код:
class Something
{
public Integer Integer { get; set; }
}
А также:
Integer x = new Integer { Value = 10 };
Something t1 = new Something();
t1.Integer = x;
Something t2 = new Something();
t2.Integer = t1.Integer;
t1.Integer.Value += 1;
Console.WriteLine(t2.Integer.Value); // Would output 11
Кажется, это противоречит интуиции: строка t2.Integer = t1.Integer
просто скопирует значение (на самом деле так и есть, но это «значение» на самом деле является ссылкой) и, таким образом, t2.Integer
останется независимым от t1.Integer
.
Изменяемый тип значения
Конечно, к этому можно подойти и по-другому, сохранив Integer
в качестве типа значения, но сохранив его изменчивость:
struct Integer
{
public int Value;
// just for kicks
public static implicit operator Integer(int value)
{
return new Integer { Value = value };
}
}
Но теперь допустим, что мы делаем это:
Integer x = 10;
Something t = new Something();
t.Integer = x;
t.Integer.Value += 1; // This actually won't compile; but if it did,
// it would be modifying a copy of t.Integer, leaving
// the actual value at t.Integer unchanged.
Console.WriteLine(t.Integer.Value); // would still output 10
По сути, неизменяемость значений — это очень интуитивно понятная вещь. Обратное очень неинтуитивно.
Я думаю, что это субъективно, хотя, если честно ;)
person
Dan Tao
schedule
20.10.2010