是否存在字段优于自动属性的情况
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" 也可以被忽略。
*:持保留态度。有 个原因,但您必须真正知道自己在做什么以及为什么要违背所有常见建议。
就简单使用而言,我认为字段和自动属性在功能上是相同的。
我知道它们有很大不同的一种情况:如果您在库的 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" 也可以被忽略。
*:持保留态度。有 个原因,但您必须真正知道自己在做什么以及为什么要违背所有常见建议。