在书<< c# in depth >>中,我读过一句话“我可以看到静态自动属性有用的唯一场景是getter是公共的而setter是私有的,并且setter只在类型初始化程序中被调用”。我不确定 Jon skeet 在这里建议什么。
在我看来,getter 和 setter 都可以用作私有或公共。
在书<< c# in depth >>中,我读过一句话“我可以看到静态自动属性有用的唯一场景是getter是公共的而setter是私有的,并且setter只在类型初始化程序中被调用”。我不确定 Jon skeet 在这里建议什么。
在我看来,getter 和 setter 都可以用作私有或公共。
关键是静态成员通常应该是线程安全的......并且自动实现的属性不是线程安全的,就任何一个线程写入的值将立即对另一个线程可见的保证而言。您无法在自动属性中更改它,因此静态自动属性唯一有用的时候是:
老实说,即使没有线程安全方面,可设置的静态属性也很不寻常(在精心设计的代码中)。
因为自动属性打破了封装,这是 OOP 的基本原则。您不能使用自动属性封装数据。封装的工作是确保您的对象保持一致的状态。如果您使用这样的自动属性:
public IFoo Foo { get; set; }
您无法验证 setter 中的值。将属性设置为null
是可能的,而您甚至没有机会注意到或禁止它。这可能是你想要的,但它可能会让你更容易错误地使用你的界面。这就是为什么前面提到的博客文章状态
这是一种代码味道,而不是反模式。
你应该更喜欢这种风格:
public IFoo Foo { get; private set; }
因为这样你就有可能将你的引用与构造函数一起注入。
public Bar(IFoo foo)
{
if (foo == null)
throw new ArgumentNullException("Foo");
this.Foo = foo;
}
这使客户更容易以正确的方式使用您的对象。我真的建议阅读前面提到的博客文章。它很好地描述了为什么你应该更喜欢保持 setter 私有。