深入C#已经有一段时间了。上次我使用它时,我使用的是 VS 2019。当时我曾经使用一个名为 Dawn Guard 的流畅验证库来验证传入方法的参数等。但黎明守卫显然已经落到了一边,不再受到支持。对于相同功能的下一个推荐是 .net Guard,其工作原理非常相似。这一切在 2019 年都运行得很好,我什至有代码片段,这样我就可以验证我可能传递的任何内容。突然间,新的视觉工作室给它加上了警告。
[STAThread]
static void Main(string[] args)
{
var host = InitializeDependencyInjection(args);
var master_form = default(IForm);
try
{
master_form = host.Services.GetService<IForm>();
Guard.NotNull(master_form, nameof(master_form));
Application.Run(master_form.getForm());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
当我进行调用并在返回值上使用保护语句时,我在 Application.Run() 行收到 CS8602“取消引用可能为空引用”的警告。
我不想关闭警告。警告是一个信号,表明有不好的东西会游上来并稍后咬你,你需要修复它。但由于 Guard 语句,空引用是“不可能”发生的,因为如果发生空引用,Guard 将抛出异常。
显然我可以做到?检查以消除警告,但我不应该这样做,因为没有正常的方法可以让对象在检查后为空
Application.Run(master_form?.GetForm());
有人知道如何让 vs 2022 认识到这一点吗?
正如您所指出的,使用 Null 条件运算符 (
?.
) 可能是您的解决方案,但由于您确定 master_form
变量不为空(因为您的 Guard.NotNull()
调用),您可以想要使用 bang(空值宽容或空值抑制)运算符 as
Application.Run(master_form!.GetForm()); // Attention to the exclamation (!)
null 条件运算符和 bang 运算符之间的区别在于,如果变量可能为 null,则使用 null 条件运算符。如果您确定变量永远不会为空,那么请使用 bang 运算符。就我个人而言,我认为没有任何理由在手边有 bang 操作符的情况下使用
Guard
调用。