【问题标题】:Auto-Implemented Property - signature of hidden member自动实现的属性 - 隐藏成员的签名
【发布时间】:2018-07-25 10:26:48
【问题描述】:

当创建一个自动实现的属性时,C# 在后台某处为该属性生成一个成员。我这辈子都不记得这叫什么,或者成员的命名约定叫什么。在谷歌上搜索了一段时间后,我认为这可能是一个好主意。

属性:

public int Age { get; set; }

我对隐藏成员的猜测(凭记忆):

private int i_age;

编辑#1

为了澄清,我正在寻找自动生成成员的术语,下面的Dmitry Bychenko 回答了这个问题。术语是“支持字段”

【问题讨论】:

  • 为什么需要这个名字? C# 版本之间的名称可能会有所不同。
  • 查看stackoverflow.com/questions/8817070/… 以获取私有支持字段的名称。
  • 这是一个实现细节,你永远不应该写任何依赖它的代码。这就是说...不,它会生成一个您无法在代码中创建的唯一名称,那么它肯定会包含不能用作 C# 标识符的 特殊字符。跨度>
  • 你为什么在乎?无论如何,您都无权访问该字段(通过反射除外),这是一个实现细节,正如 Adriano 在他的评论中所写...
  • 我想我的问题用错了,但我想要的是使用的术语。所以正如德米特里在下面回答的那样,它是“支持领域”。

标签: c#


【解决方案1】:

为什么不进行一个简单的实验

using System.Reflection;

...

public class Experiment {
  public int Age { get; set; }
}

...

var fieldNames = string.Join(", ", typeof(Experiment)
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    .Select(field => field.Name));

Console.Write(fieldNames);

结果:

<Age>k__BackingField

请注意,与 i_age 实际字段的名称不同,&lt;Age&gt;k__BackingField 不冲突 与任何字段(我们不能声明具有这样名称的字段)

【讨论】:

  • 我对反射没有经验,所以我不知道这是一个选项。这个答案正是我所希望的。非常感谢!
【解决方案2】:

嗨,你可能想试试这个。

private int i_age;
public int Age 
{ 
    get {return i_age;} 
    set {i_age = value;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2011-09-19
    • 1970-01-01
    • 2011-11-26
    • 2015-11-14
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多