如何在Rider中使用自定义属性时抑制未赋值字段警告(C#)
解决Rider中自定义属性字段未赋值警告的方案
核心思路:让Rider识别自定义属性的隐式赋值行为
Unity的[SerializeField]之所以不会触发未赋值警告,是因为它被标记了JetBrains的元数据属性,告诉代码分析器这个字段会被外部(比如编辑器、反射)初始化。我们可以给自己的自定义属性添加同样的元属性,实现相同效果。
方法一:使用JetBrains.Annotations包(推荐)
- 通过NuGet安装
JetBrains.Annotations包 - 在你的自定义属性类上添加
[MeansImplicitUse(ImplicitUseKindFlags.Assign)]属性,指定该属性代表字段会被隐式赋值:
using JetBrains.Annotations; [MeansImplicitUse(ImplicitUseKindFlags.Assign)] public class MyCustomInjectAttribute : Attribute { // 自定义属性的逻辑代码 } // 使用示例 public class TestClass { // 此时Rider不会触发"字段从未被赋值"的警告 [MyCustomInject] private string _injectedField; }
方法二:不依赖外部包,自行定义元属性
如果不想引入JetBrains的包,可以在项目中自行定义对应的元属性(仅在Debug模式下引用JetBrains,Release模式下使用自定义实现):
#if DEBUG using JetBrains.Annotations; #else // 自定义JetBrains元属性的替代实现 public enum ImplicitUseKindFlags { Assign = 0x01 } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Field)] public class MeansImplicitUseAttribute : Attribute { public ImplicitUseKindFlags UseKindFlags { get; } public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags) { UseKindFlags = useKindFlags; } } #endif // 给自定义属性标记元属性 [MeansImplicitUse(ImplicitUseKindFlags.Assign)] public class MyCustomInjectAttribute : Attribute { }
方法三:单个字段临时禁用警告(不推荐全局使用)
如果只是个别字段需要处理,可以直接用编译指令禁用指定警告:
public class TestClass { #pragma warning disable CS0649 // 禁用"字段从未被赋值"警告 [MyCustomInject] private string _injectedField; #pragma warning restore CS0649 // 恢复警告规则 }
内容的提问来源于stack exchange,提问作者Gabriel Pasquale R Scavone
相关产品推荐
相关产品推荐

