Von Gesprächen, ich glaube, das C# -Team versteht, dass sie es leichter gemacht haben, veränderliche Typen zu schreiben, während nicht ähnliche Vorteile für unveränderliche Arten. Es ist nicht so, dass sie die Unveränderlichkeit im Laufe der Zeit schwieriger gemacht haben - sie haben es einfach nicht einfacher gemacht ... außer anonymen Typen, die unveränderlich sind, aber verschiedene andere Nachteile haben. Ich würde natürlich nicht wollen, dass automatische Eigenschaften weggenommen werden - wo sie angebracht sind, sind sie wirklich nützlich. Ich würde nur gerne das Äquivalent für schreibgeschützte Eigenschaften haben (so dass sie nur im Konstruktor gesetzt werden können).
Ich habe festgestellt, dass C# 4 benannte Argumente und optionale Parameter es einfacher gemacht haben, unveränderliche Art Instanzen zu konstruieren - Sie können immer noch viele der Vorteile von Objektinitialisierern erhalten, ohne die Nachteile der Wandlungsfähigkeit. Geben Sie einfach Standardwerte für Aspekte Ihres Typs an, die wirklich optional sind, lassen Sie den Rest als obligatorische Konstruktorparameter, und der Aufrufer kann tun, was er will - mit benannten Argumenten, um Klarheit zu schaffen.
Kollektionsinitialisierer sind leider eine härtere Nuss zum Knacken. Ich möchte „gekettet“ initializers sehen, die mit unveränderlichen Sammlungen arbeiten konnte, so dass anstatt immer wieder Add
auf der gleichen Instanz aufrufen, könnte der Compiler Anrufe Plus
schaffen, die miteinander verkettet:
ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
gehen würde, um :
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");
natürlich wäre es schön, mehr unveränderlich Sammlungen im Rahmen zu haben, mit :)
All dies trägt dazu bei, die auto-props Seite, natürlich zu starten. Ich muss zugeben, ich habe vor kurzem eine bestimmte Menge Betrug, Fälschung Unveränderlichkeit privaten Setter mit:
public string Name { get; private set; }
Es macht mich aber schmutzig fühlen, nicht so dass es wirklich unveränderlich, wenn das meine eigentliche Absicht ist.
Im Grunde sage ich, dass ich deinen Schmerz fühle - und ich bin ziemlich sicher, dass das C# -Team tut. Denken Sie daran, dass sie nur begrenzte Ressourcen haben und das Entwerfen einer Sprache ist hart.
Sie können die videos from NDC 2010 interessant finden - es gibt eine große Podiumsdiskussion mit Eric Lippert, Mads Torgersen, Neal Gafter (und mir), und meine Vorschläge für C# 5 sind in einem anderen Video.
Nicht alle Typen müssen unveränderbar sein. Es ist durchaus üblich (und heilsam), einen veränderbaren Typ in einem Konstruktor zu verwenden und ihn dann in ein privates Element zu kopieren. Dann wird es vor Änderungen durch externen Code geschützt (vorausgesetzt, dass es dasselbe für mutable Abhängigkeiten tut). Dies gilt insbesondere für reine Altdatenobjekte. –