Ответ ниже был написан еще в 2010 году. В C # 6 (выпущен в 2015 году) вы можете писать автоматически реализованные свойства только для чтения:
// This can only be assigned to in a constructor
public int Foo { get; }
Ты абсолютно прав. Правильно реализованные свойства, доступные только для чтения, в настоящее время невозможны. Делать сеттер закрытым - это не одно и то же, независимо от того, что говорят некоторые книги и MSDN:)
Если бы я управлял миром, это было бы не так. Когда я встречаюсь с некоторыми языковыми дизайнерами на NDC 2010 в июне (пожалуйста, приходите!), Я намереваюсь уговорить, подкупить, уговорить и, как правило, сделать себя недовольным, пока они не согласятся. В конце концов, это всего лишь одна тонкая пластина .
Глядя на эту статью MSDN, сам текст не говорит о том, что он создает автоматическое свойство только для чтения. Он создает неизменный тип , используя автоматическое свойство, и это правильно. Единственные проблемные биты - это комментарии
// Read-only properties.
... что определенно не так. Рамки с нами согласны:
var prop = typeof(Contact).GetProperty("Name");
Console.WriteLine(prop.CanWrite); // Prints True