What is the difference between a property with a omitted setter and a property with a private setter?
public string Foo { get; private set; }
A property with an omitted setter is read only everywhere except the class constructor - including inside the class.
A property with a private setter is read only externally (even to subclasses), but writeable internally.