【问题标题】:Disable null reference warning when I've checked for nulls检查空值时禁用空引用警告
【发布时间】:2014-02-26 15:30:50
【问题描述】:

在下面的代码中,如果cmd 已经被初始化,那么我会确保在抛出异常之前关闭所有打开的连接。但是,即使在我检查 cmd 不为空之后,我仍然会在后续代码行中收到可能的空引用警告。

Dim cmd As SqlCommand
Try
    'Do some Stuff
Catch ex As Exception
    If cmd IsNot Nothing AndAlso
       cmd.Connection IsNot Nothing AndAlso              '<- null cmd warning 
       cmd.Connection.State = ConnectionState.Open Then  '<- null cmd warning 
        cmd.Connection.Close()                           '<- null cmd warning 
    End If
    Throw
End Try

我收到以下两个警告(可能一个来自 Resharper,一个来自 Visual Studio):

  • 变量“x”在访问之前可能未初始化。运行时可能会发生空引用异常。
  • BC42104:变量“x”在被赋值之前被使用。运行时可能会导致空引用异常。

根据Visual Studio Page:

应用程序至少有一个可能的路径通过其代码,该路径在分配任何值之前读取变量。

但我认为在代码中甚至没有一种可能的路径可以在不初始化的情况下使用变量。

  • 是我犯了一些错误还是这是一个错误?
  • 有没有办法阻止此警告出现?

截图如下:

这与此处已经提出的许多类似问题不同,例如 Prevent Resharper “Possible Null Reference Exception” warnings,因为我没有尝试允许 NullableType,而是已经保证我的变量不为空。


更新:

后续问题:为什么?

无论我的对象从未被初始化或初始化为Nothing,在这两种情况下cmd IsNot Nothing 都应该解析为False,因此AndAlso 之后的任何内容都不应被执行。

Dim cmd1 As SqlCommand
Console.Write(cmd1 IsNot Nothing) 'False

Dim cmd2 As SqlCommand = Nothing
Console.Write(cmd2 IsNot Nothing) 'False

也许编译器只是没有在编译时保证这一点的好方法。

【问题讨论】:

    标签: .net vb.net visual-studio resharper code-analysis


    【解决方案1】:

    你的问题不是你的值是空的,问题是你的对象根本没有初始化。例如:

        static void Main(string[] args)
        {
            List<int> empty;
    
            if (empty != null)
            {
                Console.WriteLine("no");
            }
        }
    

    不会编译,因为empty 没有价值。如果我将代码更改为:

        static void Main(string[] args)
        {
            List<int> empty = null;
    
            if (empty != null)
            {
                Console.WriteLine("no");
            }
        }
    

    它会起作用,因为我的列表现在有一个值,它是 null,但它仍然存在。

    编辑:对不起,我用 C# 代替了 VB,那是因为那个编辑器我很方便,但代码是正确的。 你每次都初始化你的变量,你不会得到错误。

    【讨论】:

    • 我没有看到反对票,我绝对没有反对你。也许有人赞成然后撤回?如果您点击分数,它将为您提供赞成票与反对票的细分。
    • 很抱歉,这是我的反对意见。这也是我的赞成票:) 我反对的原因是因为我知道这不会在 c# 中编译,但奇怪的是 vb.net 编译器只会发出警告。它编译得很好。我的印象是这不会太直观地在 vb.net 中编译;但随后操作人员说他收到了警告。很高兴知道新事物。顺便说一句,答案很好:)
    【解决方案2】:

    如果你放

    Dim cmd As SqlCommand = Nothing
    

    应该没问题..

    【讨论】:

    • 我想我的后续问题是为什么?无论我的对象是未初始化还是初始化为空,在这两种情况下,cmd IsNot Nothing 都应解析为 False,因此不应执行 AndAlso 之后的任何内容。
    • 我确定这只是一般行为。例如,如果您以日期变量为例,那将不是什么。尝试运行这个:Dim dt As Date : If IsNothing(dt) Then Throw New Exception("Hello")。它只是试图鼓励您始终将值放入变量中,即使它什么都不是,因为某些变量如果未初始化将不会解析为无:)
    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2011-08-04
    • 2020-04-20
    相关资源
    最近更新 更多