使用 Guards 取消引用可能为空的引用

问题描述 投票:0回答:1

深入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 认识到这一点吗?

c# visual-studio-2022 fluent guard
1个回答
0
投票

正如您所指出的,使用 Null 条件运算符 (

?.
) 可能是您的解决方案,但由于您确定
master_form
变量不为空(因为您的
Guard.NotNull()
调用),您可以想要使用 bang(空值宽容或空值抑制)运算符 as

Application.Run(master_form!.GetForm()); // Attention to the exclamation (!)

null 条件运算符和 bang 运算符之间的区别在于,如果变量可能为 null,则使用 null 条件运算符。如果您确定变量永远不会为空,那么请使用 bang 运算符。就我个人而言,我认为没有任何理由在手边有 bang 操作符的情况下使用

Guard
调用。

© www.soinside.com 2019 - 2024. All rights reserved.