c#6小学

c#6小学,c#,c#-6.0,C#,C# 6.0,我有以下两门课 public class Point(int x, int y) { public int X { get; } = x; public int Y { get; } = y; } public class Point2 { public int X { get; private set; } public int Y { get; private set; }

我有以下两门课

public class Point(int x, int y)
    {
        public int X { get; } = x;
        public int Y { get; } = y;
    }



    public class Point2
    {
        public int X { get; private set; }
        public int Y { get; private set; }

        public Point2(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }
使用jetbrains dotpeek,我在反编译时得到以下信息:

namespace ConsoleApplication1
{
  public class Point
  {
    public int X
    {
      get
      {
        return this.\u003CX\u003Ek__BackingField;
      }
    }

    public int Y
    {
      get
      {
        return this.\u003CY\u003Ek__BackingField;
      }
    }

    public Point(int x, int y)
    {
    }
  }
}

对于使用主构造函数的Point类,我无法理解反编译时的构造函数是空的。我认为它与第2点相同,在这里它将设置支持字段。
有人能解释一下吗?

您之所以看不到这一点,是因为初始化编译器生成的中的支持字段的代码,默认情况下dotPeek不会显示编译器生成的代码。但如果启用“显示编译器生成的代码”,您将看到以下内容:

public class Point
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly int \u003CX\u003Ek__BackingField;
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly int \u003CY\u003Ek__BackingField;

    public int X
    {
      get
      {
        return this.\u003CX\u003Ek__BackingField;
      }
    }

    public int Y
    {
      get
      {
        return this.\u003CY\u003Ek__BackingField;
      }
    }

    public Point(int x, int y)
    {
      this.\u003CX\u003Ek__BackingField = x;
      this.\u003CY\u003Ek__BackingField = y;
      base.\u002Ector();
    }
}

您之所以看不到这一点,是因为初始化由编译器生成的中的支持字段的代码,默认情况下dotPeek不会显示编译器生成的代码。但如果启用“显示编译器生成的代码”,您将看到以下内容:

public class Point
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly int \u003CX\u003Ek__BackingField;
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private readonly int \u003CY\u003Ek__BackingField;

    public int X
    {
      get
      {
        return this.\u003CX\u003Ek__BackingField;
      }
    }

    public int Y
    {
      get
      {
        return this.\u003CY\u003Ek__BackingField;
      }
    }

    public Point(int x, int y)
    {
      this.\u003CX\u003Ek__BackingField = x;
      this.\u003CY\u003Ek__BackingField = y;
      base.\u002Ector();
    }
}

有关正确的反编译代码,请参阅。它是默认构造函数,没有显式构造函数的每个C#类都有一个。由C#编译器自动生成。您的反编译器没有显示为什么需要这样做,它省略了
:base()
。确保基本构造函数也运行所必需的。本例中的System.Object构造函数。使用ildasm.exe可以让您获得更多的洞察力,它隐藏的信息更少。@Grantwiney是的-最好使用C#light;)有关正确的反编译代码,请参阅。它是默认构造函数,没有显式构造函数的每个C#类都有一个。由C#编译器自动生成。您的反编译器没有显示为什么需要这样做,它省略了
:base()
。确保基本构造函数也运行所必需的。本例中的System.Object构造函数。使用ildasm.exe可以让您获得更多的洞察力,它隐藏的信息更少。@Grantwiney是的-最好使用C#light;)