int MyProperty { set; }
仅在属性上使用 setter 的想法是什么?如果我们为某个属性设置某个值,我想它很可能会在某个时候读取该值?
只写属性在基类库中很少见,但XmlReaderSettings.XmlResolver就是一个例子。根据该主题中的安全说明,我认为省略了 get 访问器,以防止部分受信任的代码访问或篡改默认解析器。
出于同样的原因,XmlResolver.Credentials和XmlTextReader.XmlResolver可能是只写属性。
(奇怪的是,XmlAttribute.InnerText也是只写属性,但这似乎不是一个好的设计。)
按照上面的例子,我想说你应该只在读写属性有意义时才使用只写属性,但出于安全原因你不想要 get 访问器。
您当然可以使用Set
方法来代替,但属性的优点是它可以在对象初始化器中使用,就像通常使用XmlReaderSettings
.
您通常不会创建这样的属性。正如你所说,它没有多大价值。
如果你真的想只允许设置某个值而不读取它,那么提供一个方法。这样更干净。
只有一个 setter 的 auto-property 没有多大意义。手动实现的属性只有一个设置器,然后可以设置内部使用的字段,但在外部不可见,这是有意义的。
具有仅设置属性非常少见,并且通常使用设置方法而不是属性来实现,因为对于大多数开发人员来说,仅设置属性不是预期的行为。
实际上,自动实现的属性定义 aset
而没有 a是编译器错误get
。必须手动定义仅设置属性。
一种方法比“只写属性”更有意义——即使代码确实编译了。关于只写属性有一个有趣的讨论这里