是否存在字段优于自动属性的情况

Are there cases where Fields are better than auto-properties

就简单使用而言,我认为字段和自动属性在功能上是相同的。

我知道它们有很大不同的一种情况:如果您在库的 dll 中公开 属性 并让其他代码使用该 dll,那么(我相信?)您可以更改属性实现,重新编译dll并替换文件,调用代码不需要重新编译。

如果您公开的是一个字段,然后更改为 "reimplement" 该字段,因为更复杂的内容需要以某种方式告知调用代码有关更改的信息。

我反复 运行 了解字段和属性之间差异的另一个地方是基于反射的库。 例如。 CsvHelper 或 ServiceStack.Text,两者都将提供 'out-of-the-box' 序列化,但只会查看属性,而不是字段(因为我只花了 2 个小时才意识到 :sad face: )。 我想我过去也和 AutoMapper 有过类似的事情? 好像是比较常见的事情。

因此在我看来,我应该下定决心永远不要使用字段;属性在大多数情况下是平等的,而在其他情况下则非常优越。唯一的缺点是声明中额外的“{get;set;}”大约有 12 个字符。

任何人都可以给出反例:

编辑: 相关但不相同:Public Fields versus Automatic Properties 这似乎是一个利弊列表,我没有看到任何关于领域优势的评论,从一个简短的浏览。请随意 post 评论,这些评论是我在其中遗漏的答案的链接。

根据您链接的问题,第一个答案 突出显示了一个可以使用字段而不能使用属性的特定位置,即 ref 参数。

考虑:

int a;
int B { get; set; }
void F()
{
    a = 0;
    G(ref a); // a will be incremented
    B = 0;
    G(ref B); // Compiler error CS0206
}
void G(ref int p)
{
    ++p;
}

您可以对字段执行而不能对属性执行的一件事是访问它们 ref。这包括与 Interlocked.CompareExchange().

一起使用

因此,如果 Node.Next 不是一个字段, 处的代码将不起作用。

请注意,它是私有的 class。通常,属性优于字段的好处是,当您确实需要一个字段时,您希望它是内部实现细节,而不是公开暴露的东西。

我不会使用自动属性的另一种情况是 static readonly 字段用作 "moral" 等同于 const 字段的类型,其中类型不是原始类型或字符串。

您可以通过反转问题来提出每个问题 "not a duplicate",但这并不能改变您问错问题的事实。实际问题是 "When would I use a public field on a class",答案是:从不。您永远不应该使用 public 字段。曾经。真的,没有理由*。

MSDN: Generally*, you should use fields only for variables that have private or protected accessibility.

使用属性的原因在所有链接到这个问题的问题中都有解释,但主要是:封装。

当然,你不能用属性做的一件事是通过 ref 传递它们,但是一旦你深入研究那么所有 "best practices" 也可以被忽略。

*:持保留态度。有 个原因,但您必须真正知道自己在做什么以及为什么要违背所有常见建议。