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