.Net8主构造函数和具有默认值的字段[S3604:删除成员初始化器,所有构造函数为成员设置初始值]

j2cgzkjk  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(152)

我想从.Net6迁移到.Net8,并使用主构造函数。它在正常的依赖注入下工作得非常好,但如果我有一个字段,它只使用默认值,我不知道该怎么办。例如在这里:

示例#1

  1. public class MyClass : IMyClass
  2. {
  3. private readonly IDependecyService dependencyService;
  4. private readonly ConcurrentDictionary<string, TypedId?> typedIdDictionary;
  5. public MyClass(IDependecyService dependencyService)
  6. {
  7. this.dependencyService = dependencyService;
  8. typedIdDictionary = new();
  9. }
  10. ...
  11. }

字符串
我把它转换成:

  1. public class MyClass(IDependecyService dependencyService) : IMyClass
  2. {
  3. private readonly ConcurrentDictionary<string, TypedId?> typedIdDictionary; = new();
  4. ...
  5. }


但我得到了一个警告
错误S3604:删除成员初始化器,所有构造函数为成员设置初始值。(https://rules.sonarsource.com/csharp/RSPEC-3604

另一个例子

发件人:

  1. public class MyClass : IMyClass
  2. {
  3. private readonly string valueFromConfig;
  4. public MyClass(IConfig config)
  5. {
  6. this.valueFromConfig = config.Value;
  7. }
  8. ...
  9. }


进入:

  1. public class MyClass(IConfig config) : IMyClass
  2. {
  3. private readonly string valueFromConfig; = config.Value;
  4. ...
  5. }


然后我得到了同样的警告。

提问

如何根据.Net规则和代码风格正确处理?
我尝试将默认值= new()放入主构造函数,但它只接受值类型或null

kfgdxczn

kfgdxczn1#

这不是一个C#错误。似乎所使用的SonarQube版本不完全支持C# 12。官方的C# 12支持已在9.13中添加。发行说明包括对涉及主构造函数的6个误报的修复:

  1. 8143 - [C#] Fix S107 FN: support primary constructors
  2. 8131 - [C#] Fix S1117 FN: support primary constructors
  3. 8122 - [C#] Fix S1118 FN: empty primary constructor
  4. 8096 - [C#] Fix S3254 FN: primary constructors
  5. 8092 - [C#] Fix S3253 FN: primary parameterless constructors
  6. 8071 - [C#] Fix S2234 FN: primary constructors for records, classes and structs

字符串

相关问题