如何注解构造函数调用的类方法已实例化指定类成员?
用注解标记初始化方法已实例化类成员以消除IDE警告
问题场景
我有一个类,多个构造函数共享部分初始化逻辑,将这部分逻辑抽入initSomeExampleMembers()方法后,IDE无法检测到该方法已实例化Map成员,因此抛出警告:
构造函数执行后Map应具有值,是否将其定义为可空类型?
已知可以通过局部抑制警告或重构构造函数复用解决,但想了解是否存在注解方式,标记该init方法已实例化特定类成员。
示例代码:
class ExampleClass { private ImmutableDictionary Map; private void initSomeExampleMembers() { //Fill Dictionary with 10 default instances of a class } ExampleClass() { initSomeExampleMembers(); } ExampleClass(/*some params*/) { initSomeExampleMembers(); //perform operations on Map items.. //instantiate some more ExampleClass members.. } }
解决方案:使用成员非空注解
根据你使用的框架和IDE,有两种主流注解方案:
1. .NET 6+ 原生注解
从.NET 6开始,System.Diagnostics.CodeAnalysis命名空间提供了MemberNotNullAttribute,可以直接标记方法会初始化指定成员:
修改后的代码:
using System.Diagnostics.CodeAnalysis; class ExampleClass { private ImmutableDictionary Map; [MemberNotNull(nameof(Map))] private void initSomeExampleMembers() { // 必须在这里实际完成Map的初始化,注解仅用于告知编译器 Map = ImmutableDictionary.Create(...); } ExampleClass() { initSomeExampleMembers(); } ExampleClass(/*some params*/) { initSomeExampleMembers(); // 操作Map不会再触发警告 } }
该注解会告诉编译器:执行此方法后,Map成员一定不为null,从而消除警告。
2. JetBrains IDE(Rider/Resharper)专属注解
如果你使用JetBrains系列IDE,可以通过JetBrains.Annotations包中的MemberNotNullAttribute实现同样效果:
- 先安装
JetBrains.AnnotationsNuGet包 - 在方法上添加注解:
using JetBrains.Annotations; class ExampleClass { private ImmutableDictionary Map; [MemberNotNull(nameof(Map))] private void initSomeExampleMembers() { Map = ImmutableDictionary.Create(...); } // 构造函数代码不变 }
额外替代方案:构造函数链调用
如果你不想引入注解,也可以通过构造函数链复用初始化逻辑,IDE同样能识别成员已初始化:
class ExampleClass { private ImmutableDictionary Map; private void initSomeExampleMembers() { Map = ImmutableDictionary.Create(...); } ExampleClass() { initSomeExampleMembers(); } // 带参构造调用无参构造,复用初始化逻辑 ExampleClass(/*some params*/) : this() { //perform operations on Map items.. //instantiate some more ExampleClass members.. } }
内容的提问来源于stack exchange,提问作者Andrea Bardelli
相关产品推荐
相关产品推荐

