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

tem*_*ame 5 c#

拿这个代码:

public int Foo {get;set;}
Run Code Online (Sandbox Code Playgroud)

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

private int x;
public int X 
{
    get { return x; }
    set { x = value; }
}
Run Code Online (Sandbox Code Playgroud)

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

我不确定我所看到的这个约定是否有一个小写的私有属性被面向公众的大写掩盖,只是那个,约定,或者它实际上是语言/编译器的一部分,你可以写出来或者让它它会为你完成.

iul*_*net 5

外壳与此无关。

编写如下所示的属性

public int x { get; set; }
Run Code Online (Sandbox Code Playgroud)

get将始终创建并使用通过/操作的匿名私有字段set

  • 编写 `public int x { get; }` 的区别在于它创建了一个 `readonly` 字段,而不是一个普通的字段。 (2认同)
  • @Aerovistae 被称为“属性初始值设定项”,这是 C# 6.0 中引入的功能(在此之前您只能在声明时初始化类似字段,而不能初始化属性) (2认同)

Dmi*_*nko 5

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

  public class Test {
    // private int myProp;

    public int MyProp {
      get;
      set;
    }
  }
Run Code Online (Sandbox Code Playgroud)

...

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

  Console.Write(report);
Run Code Online (Sandbox Code Playgroud)

你会得到一个非常奇怪的名字

<MyProp>k__BackingField

但是这个奇怪的支持字段名称确保不存在名称冲突(您不能声明任何字段,属性,方法等<).

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

myProp
<MyProp>k__BackingField
Run Code Online (Sandbox Code Playgroud)

请注意,这myProp不是MyProp财产的支持领域

  • @Aerovistae:您说得对:您将拥有与 *property* `X` 无关的 *field* `x`;并且属性`X` 将有自己的*支持字段*,带有那个奇怪的自动生成的名称。 (2认同)