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

C# 是否存在字段优于自动属性的情况,c#,reflection,properties,field,C#,Reflection,Properties,Field,就简单使用而言,我认为字段和自动属性在功能上是相同的 我知道有一种情况它们有很大的不同:如果你在库的dll中公开了一个属性,并且有其他代码使用该dll,那么(我相信?)你可以更改属性实现,重新编译dll并替换文件,而调用的代码不需要重新编译 如果您公开的是一个字段,那么将该字段更改为“重新实现”,因为更复杂的事情需要调用代码以某种方式告知更改 我反复遇到字段和属性之间差异的另一个地方是基于反射的库。 例如,CsvHelper或ServiceStack.Text,两者都将提供“开箱即用”的序列化,

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

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

如果您公开的是一个字段,那么将该字段更改为“重新实现”,因为更复杂的事情需要调用代码以某种方式告知更改

我反复遇到字段和属性之间差异的另一个地方是基于反射的库。 例如,CsvHelper或ServiceStack.Text,两者都将提供“开箱即用”的序列化,但只查看属性,而不查看字段(因为我刚刚花了2个小时才意识到:悲伤的脸:)。 我想我过去也和AutoMapper有过类似的经历? 这似乎是一件比较普通的事情

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

任何人都可以举出以下两种情况的反例:

  • 字段优于属性的常用情况
  • 依赖字段而不是自动属性的库
编辑: 相关但不完全相同:
这似乎是一个赞成和反对的列表,从一个简短的浏览中,我看不到任何关于该领域优势的评论。请随意发表评论,这些评论是我在这里错过的答案的链接。

从您链接的问题中,第一个答案突出显示了一个特定的地方,在那里可以使用字段,而属性不能使用,这就是
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
,而对属性则不能。这包括与互锁的
一起使用。CompareExchange()

因此,如果
节点.Next
不是字段,则处的代码将不起作用


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

我不使用自动属性的另一种情况是
静态只读
字段用作“道德”字段与类型不是基元或字符串的
const
字段等效。

您可以通过反转问题使每个问题“不是重复的”,但这不会改变您提出错误问题的事实。实际问题是“我什么时候会在类上使用公共字段”,答案是:永远不会。永远不要使用公共字段。曾经真的,没有理由

:通常*,您应该仅对具有私有或受保护可访问性的变量使用字段

使用属性的原因将在与此问题相关的所有问题中解释,但主要是:封装

当然,有一件事你不能对属性做,你可以对字段做,那就是通过
ref
传递它们,但是一旦你深入到这个层次,所有的“最佳实践”也可以被忽略


*:与一粒盐一起服用。这是有原因的,但您必须真正知道自己在做什么,以及为什么要违背所有常见的建议。

通常字段不会公开,除非它们是
const
。公共常量在任何地方都被广泛使用(intellisense=使用它们时的巨大帮助)会以不同的方式显示字段。谈到私有类型变量,您很可能从私有字段开始。只有同时需要原始字段值和converter/validated/whatever(通过属性1)时,它才会成为属性。你是对的:你提出的问题与我的问题相同,但它也不是我链接的问题的副本。链接的问题给出了很多理由/案例,其中道具比字段更好,但我没有发现任何相反的情况。喜欢“一旦你[通过参考传递东西]所有的最佳实践都可以忽略”这一点,尽管:)+1就是为了这个。没有任何地方提到“更好”;所有这些都是不同之处。如果您想对属性执行无法执行的操作,请使用字段。在所有其他情况下,使用一个属性。你是对的:我没有把它拿走——我只是认为,当你不可避免地需要一个非平凡的实现时,它就会变成一个突破性的更改(原因可能包括
ref
传递),也就是说,你应该从一开始就使用道具,以避免突破性的更改。谢谢你的夸奖。