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

时间:2016-01-14 14:41:47

标签: c# reflection properties field

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

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

如果你暴露的是一个Field,然后改为“重新实现”那个字段,因为更复杂的东西要求调用代码以某种方式告知变化。

另一个我反复遇到字段和属性之间差异的地方是基于反射的库。 例如。 CsvHelper或ServiceStack.Text,两者都将提供“开箱即用”的Serialisations,但它们只会查看属性,而不是字段(因为我只花了2个小时才意识到:悲伤的脸:)。 我觉得我过去也和AutoMapper有类似的东西吗? 这似乎是一件相对普遍的事情。

在我看来,我应该决心永远不要使用Field;在绝大多数情况下,物业是平等的,而在其他情况下,物业是绝对优越的。唯一的缺点是声明中额外的“{get; set;}”大约有12个字符。

任何人都可以提供反例:

  • 一般情况下使用Fields优于Properties的情况?
  • 依赖于某些字段而不是自动属性的库?

编辑: 相关但不相同:Public Fields versus Automatic Properties 这似乎是一个优点和缺点的列表,我没有看到任何关于字段优势的评论,从简短的浏览。随意发表评论链接到我在那里错过的答案。

4 个答案:

答案 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;也可以忽略。

*:用一粒盐服用。 的原因,但你必须真正知道自己在做什么以及为什么要反对所有常见的建议。