当 C# 使用不能为 null 的参数调用我的方法时避免警告
Avoid warnings when C# calls my methods with arguments that cannot be null
我已阅读 docs C# 可空引用类型。
我不确定如何处理框架调用我的方法的情况。
一个简单的 EF Core 示例:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfiguration(new CustomerConfiguration()); // <--- CA1062
}
这会引发警告 CA1062:
In externally visible method 'void DbContext.OnModelCreating(ModelBuilder builder)', validate parameter 'builder' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument. csharp(CA1062)
我假设框架不会向我发送 null,所以我认为检查 null 没有意义。
我该如何处理这种情况,即:框架使用不能为空的参数调用我的方法?
编辑:我的问题与链接的问题不同,因为它是通用的,专门询问 C# 8 的 NRT 功能。我只选择了一个相关的例子。无论如何感谢所有帮助过的人。
根据我的评论,如果 builder
不是 null
,您可以使用 null-conditional operator ?.
仅调用 ApplyConfiguration
方法:
builder?.ApplyConfiguration(new CustomerConfiguration());?
来自文档:
A null-conditional operator applies a member access, ?.
, or element
access, ?[]
, operation to its operand only if that operand evaluates
to non-null; otherwise, it returns null.
根据评论中的讨论进行编辑
我认为包含一个 OP 已经知道的替代方案是有意义的,但我将展示一个更全面的解决方案。
而不是使用空条件运算符(这实际上会隐藏任何问题是 builder
实际上是 null
),只需在方法开始时测试 builder
:
protected override void OnModelCreating(ModelBuilder builder) {
if (builder == null) throw new ArgumentNullException(nameof(builder));
base.OnModelCreating(builder);
...
这将是处理 null
值 builder
的更全面的方法,因为如果您收到 null
进入方法。
另一个选项是禁用诊断 CA1062,如果您认为该规则不会在您的方案中增加任何价值。
您可以在不同级别以不同方式禁用诊断。使用 .editorconfig
文件应用于磁盘上的给定子树。使用 #pragma
或 GlobalSuppressions.cs
隐藏代码中的特定区域。
我已阅读 docs C# 可空引用类型。
我不确定如何处理框架调用我的方法的情况。
一个简单的 EF Core 示例:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfiguration(new CustomerConfiguration()); // <--- CA1062
}
这会引发警告 CA1062:
In externally visible method 'void DbContext.OnModelCreating(ModelBuilder builder)', validate parameter 'builder' is non-null before using it. If appropriate, throw an ArgumentNullException when the argument is null or add a Code Contract precondition asserting non-null argument. csharp(CA1062)
我假设框架不会向我发送 null,所以我认为检查 null 没有意义。
我该如何处理这种情况,即:框架使用不能为空的参数调用我的方法?
编辑:我的问题与链接的问题不同,因为它是通用的,专门询问 C# 8 的 NRT 功能。我只选择了一个相关的例子。无论如何感谢所有帮助过的人。
根据我的评论,如果 builder
不是 null
,您可以使用 null-conditional operator ?.
仅调用 ApplyConfiguration
方法:
builder?.ApplyConfiguration(new CustomerConfiguration());?
来自文档:
A null-conditional operator applies a member access,
?.
, or element access,?[]
, operation to its operand only if that operand evaluates to non-null; otherwise, it returns null.
根据评论中的讨论进行编辑
我认为包含一个 OP 已经知道的替代方案是有意义的,但我将展示一个更全面的解决方案。
而不是使用空条件运算符(这实际上会隐藏任何问题是 builder
实际上是 null
),只需在方法开始时测试 builder
:
protected override void OnModelCreating(ModelBuilder builder) {
if (builder == null) throw new ArgumentNullException(nameof(builder));
base.OnModelCreating(builder);
...
这将是处理 null
值 builder
的更全面的方法,因为如果您收到 null
进入方法。
另一个选项是禁用诊断 CA1062,如果您认为该规则不会在您的方案中增加任何价值。
您可以在不同级别以不同方式禁用诊断。使用 .editorconfig
文件应用于磁盘上的给定子树。使用 #pragma
或 GlobalSuppressions.cs
隐藏代码中的特定区域。