就简单使用而言,我认为字段和自动属性在功能上是相同的。
我知道有一个案例,它们有很大不同:如果你在一个dll中为一个库公开一个属性并使用该dll有其他代码,那么(我相信?)你可以改变属性实现,重新编译dll并替换文件,调用代码不需要重新编译。
如果你暴露的是一个Field,然后改为“重新实现”那个字段,因为更复杂的东西要求调用代码以某种方式告知变化。
另一个我反复遇到字段和属性之间差异的地方是基于反射的库。 例如。 CsvHelper或ServiceStack.Text,两者都将提供“开箱即用”的Serialisations,但它们只会查看属性,而不是字段(因为我只花了2个小时才意识到:悲伤的脸:)。 我觉得我过去也和AutoMapper有类似的东西吗? 这似乎是一件相对普遍的事情。
在我看来,我应该决心永远不要使用Field;在绝大多数情况下,物业是平等的,而在其他情况下,物业是绝对优越的。唯一的缺点是声明中额外的“{get; set;}”大约有12个字符。
任何人都可以提供反例:
编辑: 相关但不相同:Public Fields versus Automatic Properties 这似乎是一个优点和缺点的列表,我没有看到任何关于字段优势的评论,从简短的浏览。随意发表评论链接到我在那里错过的答案。
答案 0 :(得分:3)
根据您关联的问题,第一个答案https://stackoverflow.com/a/1180870/3419534突出显示了可以使用字段且属性不能使用的特定位置,这是app.factory('Person', ['$resource', function($resource) {
return $resource(
'api/path/:personId',
{personId: '@_id'},
{
update: {method: 'PUT'},
get: {
method: 'GET',
isArray: false,
interceptor: {
response: function(response) {
var resource = response.resource;
resource.fullname = resource.name + ' ' + resource.surname;
return resource;
}
}
}
});
}]);
个参数。
考虑:
[
{
"op": "add",
"path": "/fields/System.Title",
"value": "Child work item"
},
{
"op": "add",
"path": "/fields/System.AssignedTo",
"value": "Leo Dsouza <dsouzaleo@hotmail.com>"
},
{
"op": "add",
"path": "/fields/System.Description",
"value": "Description goes here"
}
]
答案 1 :(得分:2)
您可以使用属性执行的字段可以访问它们Heeello
H<><><>llo
H<>llo
Hello
。这包括与ref
一起使用。
因此,如果Interlocked.CompareExchange()
不是某个字段,那么https://stackoverflow.com/a/3871198/400547的代码就无法运作。
请注意,它是在私人课堂上。作为一项规则,属性优于字段的好处是,当您需要字段时,您希望它是内部实现细节,而不是公开暴露的内容。
答案 2 :(得分:1)
我不使用自动属性的另一种情况是static readonly
字段用作const
字段的“道德”等价字体,其中类型不是基元或字符串。
答案 3 :(得分:1)
你可以提出每一个问题&#34;不是重复的问题&#34;通过颠倒问题,但这并没有改变你提出错误问题的事实。实际的问题是&#34;我什么时候会在类#34; 上使用公共字段,答案是:从不。你永远不应该使用公共领域。永远。真的,没有理由*。
MSDN:通常*,您应该仅将字段用于私有或受保护的辅助功能的变量。
在与此问题相关的所有问题中都解释了使用属性的原因,但主要是:封装。
当然,对于你可以使用字段的属性,你不能做的一件事就是通过ref
传递它们,但是一旦你深入了解所有&#34;最佳实践&#34;也可以忽略。
*:用一粒盐服用。 是的原因,但你必须真正知道自己在做什么以及为什么要反对所有常见的建议。