Во-первых:
Какова цель возврата нового объекта каждый раз, когда вы хотите изменить значение?
Я думаю, вы можете ошибаться относительно того, как работают типы значений. Это не дорогостоящая операция, как вы, возможно, представляете; это просто перезапись данных (в отличие, например, от динамического выделения новой памяти).
Во-вторых: вот очень простой пример того, почему числа неизменны:
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
По сути, неизменность значений - это то, что очень интуитивно понятно . Противоположность крайне не интуитивна.
Полагаю, это субъективно, если честно;)