大写属性是否在 C# 中自动创建小写私有属性?

本文关键字:属性 创建 是否 | 更新日期: 2023-09-27 17:56:51

取以下代码:

public int Foo {get;set;}

与此更完整的手动编写代码相反:

private int x;
public int X 
{
    get { return x; }
    set { x = value; }
}

在第一个示例中,编译器是否会自动创建 private foo 属性?

不确定我见过的这个约定,即一个小private属性被面向public的大属性掩盖,是否只是约定,或者它实际上是语言/编译器的一部分,你可以把它写出来,或者让它为你完成。

大写属性是否在 C# 中自动创建小写私有属性?

为什么不看看发生了什么?

  public class Test {
    // private int myProp;
    public int MyProp {
      get;
      set;
    }
  }

  string report = String.Join(Environment.NewLine, typeof(Test)
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    .Select(field => field.Name));
  Console.Write(report);

你会得到一个很奇怪的名字

<MyProp>k__BackingField

但是,这个奇怪的支持字段名称可确保不会有名称冲突(您不能声明任何以 < 开头的字段、属性、方法等)。

编辑:如果您取消注释// private int myProp;行,您将拥有

myProp
<MyProp>k__BackingField

请注意,myProp不是MyProp属性的支持字段。

外壳与它无关。

编写如下所示的属性

public int x { get; set; }

将始终创建和使用它通过 get/set 进行操作的匿名私有字段。

编译器

确实为您创建了一个所需类型的私有支持字段,但是使用另一个名称(它不像您的示例中那样简单地x,它更像<X>_BackingField)。因此,您无法访问该字段。但是,实际语法非常相似。

进一步查看自动生成的属性:

编译器创建一个私有的匿名支持字段,只能通过属性的 get 和 set 访问器访问该字段。

话虽如此,您问题中的两个代码示例在含义上是相同的。