Из разговоров я полагаю, что команда C # понимает, что они упростили написание изменяемых типов, не предоставляя аналогичных преимуществ для неизменяемых типов.Дело не в том, что с течением времени они усложнили неизменность - они просто не сделали это легче ... за исключением анонимных типов, которые являются неизменяемыми, но имеют ряд других недостатков.Я, конечно, не хотел бы, чтобы автоматические свойства были убраны - там, где они уместны, они действительно полезны.Я просто хотел бы иметь эквивалент для свойств только для чтения (позволяя устанавливать их только в конструкторе).
Я обнаружил, что именованные аргументы и необязательные параметры C # 4 облегчают создание неизменяемого типахотя случаи - вы все еще можете получить много преимуществ инициализаторов объектов, без недостатков изменчивости.Просто предоставьте значения по умолчанию для аспектов вашего типа, которые действительно являются необязательными, оставьте остальные как обязательные параметры конструктора, и вызывающая сторона может делать то, что они хотят - используя именованные аргументы для большей ясности.
Инициализаторы коллекций - более сложный вопросвзломать, к сожалению.Я хотел бы видеть «цепочечные» инициализаторы, которые могли бы работать с неизменяемыми коллекциями, чтобы вместо многократного вызова Add
в одном и том же экземпляре, компилятор мог создавать вызовы Plus
, которые объединялись в цепочку:
ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
будет идти по адресу:
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");
Конечно, было бы неплохо иметь больше неизменяемых коллекций в рамках для начала:)
Ничто из этого не помогает в автореквизит, конечно.Я должен признать, что недавно я обманул определенную сумму, притворяясь неизменным, используя частные сеттеры:
public string Name { get; private set; }
Это действительно заставляет меня чувствовать себя грязным, не делая его действительно неизменным, когда этомое реальное намерение.
По сути, я говорю, что чувствую вашу боль - и я почти уверен, что команда C # чувствует.Однако имейте в виду, что у них ограниченные ресурсы, а разработка языка чертовски трудна.
Вы можете найти видео с NDC 2010 интересными - есть отличная дискуссия с Эриком Липпертом, Мэдс Торгерсен, Нил Гафтер (и я), и мои предложения по C # 5 в другом видео.