【问题标题】:Is the implementation of Auto Properties in the spec?规范中是否实现了自动属性?
【发布时间】:2009-07-23 21:47:26
【问题描述】:

我可以相信名为 Foo 的属性的基础字段称为“k__BackingField”这一事实吗?

【问题讨论】:

  • Re Hessian;为什么它关心字段名称?属性名称会更合适,不是吗?如果没有,也许发明一个属性来命名成员,即 [Hessian.Storage("foo")] public int Foo {get;private set;}
  • 我宁愿只实现名称规范化的技巧 (k__backingField --> Foo) - 这对客户来说更容易。
  • Problems with auto-properties 的可能重复项

标签: c# .net automatic-properties specifications


【解决方案1】:

不,简而言之。

出于这个原因,自动属性在与BinaryFormatter 等基于字段的序列化程序一起使用时会很痛苦(我相信我之前可能已经提到过;-p)。

请参阅:Obfuscation, serialization and automatically implemented properties 了解有关此问题(和解决方案)的一些想法。

【讨论】:

    【解决方案2】:

    规范没有指定支持字段的名称(有充分的理由 - 你不应该依赖它)。

    您应该调查一下 Mono 编译器是否做同样的事情。

    检查该字段是否应用了CompilerGeneratedAttribute 是个好主意。

    请注意,显式接口实现(当前)会出现:

    <Full.Namespace.To.Interface.IBlah.Foo>k__BackingField
    

    因此,试图以这种方式序列化类的特定方面的代码可能会被误导。

    如果你想真正了解你的代码,你可以使用像 mono 的 Cecil 这样的库来检查属性的 get 函数并确定使用的字段。

    【讨论】:

    • 我只是想让它在 Windows 上为我工作,没什么花哨的 - 但检查属性是个好主意,谢谢。
    • 我认为显式实现也是安全的,因为显式实现的属性的名称遵循Full.Namespace.To.Interface.IBlah.Foo模式。
    【解决方案3】:

    当然不是。这将是一个私有实现细节。

    你到底为什么想知道?

    【讨论】:

    • 修复 Hessian 序列化中的一个错误。自动属性未正确序列化,因为它们使用字段的名称。
    • “Hessian 的连载”?请给个链接好吗?没听说过。
    【解决方案4】:

    我不这么认为。如果您需要支持字段,请使用“常规”属性。

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 1970-01-01
      • 2010-09-15
      • 2014-06-09
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多