我使用的是C#12.在C#12中,我可以使用主构造函数:

Implementation 1 :

public class Calculation(int a,int b)
{
  public int Addition() => a + b;
  public int Subtraction() => a - b;
}

Implementation 2 :

public class Calculation(int a,int b)
{
 private int _a { get; init; } = a;
 private int _b { get; init; } = b;
 public int Addition() => _a + _b;
 public int Subtraction() => _a - _b;
}

当我像这样调用此方法时:

console.WriteLine(new Calculation(10,25).Addition());

两个实现都运行得很好,所以我想知道使用较长的实现2比使用较短的实现1是否有优势.

推荐答案

用这种方式自己创建字段/属性是没有意义的,因为在这种情况下,编译器会为您创建它们(反编译@sharplab.io).

Tutorial: Explore primary constructors个文档(它们使用struct,但主ctor的处理是相同的):

public struct Distance(double dx, double dy)
{
   public readonly double Magnitude => Math.Sqrt(dx * dx + dy * dy);
   public readonly double Direction => Math.Atan2(dy, dx);

   public void Translate(double deltaX, double deltaY)
   {
      dx += deltaX;
      dy += deltaY;
   }

   public Distance() : this(0,0) { }
}

在上一个示例中,在方法中访问主要构造函数属性.因此,编译器创建隐藏字段来表示每个参数.下面的代码大致显示了编译器生成的内容.实际的字段名是有效的CIL标识符,但不是有效的C#标识符.

public struct Distance
{
   private double __unspeakable_dx;
   private double __unspeakable_dy;

   public readonly double Magnitude => Math.Sqrt(__unspeakable_dx * __unspeakable_dx + __unspeakable_dy * __unspeakable_dy);
   public readonly double Direction => Math.Atan2(__unspeakable_dy, __unspeakable_dx);

   public void Translate(double deltaX, double deltaY)
   {
       __unspeakable_dx += deltaX;
       __unspeakable_dy += deltaY;
   }

   public Distance(double dx, double dy)
   {
       __unspeakable_dx = dx;
       __unspeakable_dy = dy;
   }
   public Distance() : this(0, 0) { }
}

潜在的缺点是生成的字段是可变的:

public class Calculation(int a, int b)
{
    public void Mutate() => a = 100;
    // ...
}

虽然您的方法不能解决这个问题,但是当您可以混淆_aa时,它会带来一些混乱.目前无法将生成的字段标记为readonly(但有针对该功能的计划-请参见this LDM notes docthis proposal),但您可以使用具有相同名称(或属性)的字段来隐藏ctor参数:

public class Calculation2(int a, int b)
{
    private readonly int a = a;    
    private readonly int b = b;
    // public void Mutate() => a = 100; // does not compile
    public int Addition() => a + b;
    public int Subtraction() => a - b;
}

另见:

Csharp相关问答推荐

无法使用并行库并行化我的代码

如何使用C#和Graph API从Azure Directory获取用户详细信息

在. net毛伊岛窗口的深度链接已经创建""

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

在多对多关系上不删除实体

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

Thad.Sept()vs Task.Delay().Wait()

MigraDoc文档

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

C#带主体的主构造函数?

如何将字符串变量传递给JObject C#-无法加载文件或程序集';System.Text.Json

如何在C#中创建VS代码中的控制台应用程序时自动生成Main方法

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

使用postman 测试配置了身份的.NET 6应用程序

如何在更新数据库实体时忽略特定字段?

HttpClient,上传文件时实现进度

如何获取我在SQL中输入的值