C# 为什么静态自动属性只有在getter是公共的而setter是私有的情况下才有用

C# 为什么静态自动属性只有在getter是公共的而setter是私有的情况下才有用,c#,static,automatic-properties,C#,Static,Automatic Properties,在这本书中,我读过一句话“我能看到静态自动属性有用的唯一场景是getter是公共的,setter是私有的,setter只在类型初始值设定项中被称为whithin”。我不知道Jon skeet在这里建议了什么 在我看来,getter和setter都可以用作private或public 因为自动属性中断,这是OOP的一个基本原则。不能用自动属性封装数据。封装的工作是确保对象保持一致的状态。如果您使用的是如下自动特性: public IFoo Foo { get; set; } 您没有选项来验证se

在这本书中,我读过一句话“我能看到静态自动属性有用的唯一场景是getter是公共的,setter是私有的,setter只在类型初始值设定项中被称为whithin”。我不知道Jon skeet在这里建议了什么


在我看来,getter和setter都可以用作private或public

因为自动属性中断,这是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私有。

重点是静态成员通常应该是线程安全的。。。自动实现的属性并不是线程安全的,因为它保证了一个线程编写的值对另一个线程立即可见。您无法在自动属性中更改该属性,因此静态自动属性唯一有用的时间是:

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

老实说,即使没有线程安全方面,可设置的静态属性(在设计良好的代码中)一开始也是非常不寻常的。

整句话是什么?如果你直接问他,你可能会有更好的运气。首先想到的是线程安全。如果您有一个公共的静态自动属性设置器,那么您可以轻松地创建竞争条件,因为该设置器在所有类实例之间共享。@JohnWillemse这句话只是声明了静态自动属性的场景。我知道我们需要额外的工作来确保setter线程安全,这不应该只应用于静态自动属性。@ValidfroM,如果您从代码中的不同位置访问此属性(这是静态属性的常见情况),您将怎么做?如何在不同类之间共享
\u lock
字段以同步访问?一个好的google查询是“全局变量是邪恶的”。这句话是关于静态自动属性的。您的示例是关于正常自动属性的。但是我同意你的观点,静态类和非静态类的问题是一样的。在这种情况下,static仅将类的实例数限制为1。然而,这使得控制数据的设置方式通常更加重要。