4

在书<< c# in depth >>中,我读过一句话“我可以看到静态自动属性有用的唯一场景是getter是公共的而setter是私有的,并且setter只在类型初始化程序中被调用”。我不确定 Jon skeet 在这里建议什么。

在我看来,getter 和 setter 都可以用作私有或公共。

4

2 回答 2

4

关键是静态成员通常应该是线程安全的......并且自动实现的属性不是线程安全的,就任何一个线程写入的值将立即对另一个线程可见的保证而言。您无法在自动属性中更改它,因此静态自动属性唯一有用的时候是:

  • 如果你不关心线程安全
  • 如果 setter 是私有的并且仅从静态初始化器设置(它是自动线程安全的)。在这种情况下,我通常只有一个只读静态变量和一个 getter-only 属性来公开它。

老实说,即使没有线程安全方面,可设置的静态属性也很不寻常(在精心设计的代码中)。

于 2013-05-25T08:11:09.233 回答
3

因为自动属性打破了封装,这是 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 私有。

于 2013-05-24T09:33:45.660 回答