【问题标题】:Checking nullable result of OpenFileDialog检查 OpenFileDialog 的可为空结果
【发布时间】:2013-10-29 11:05:35
【问题描述】:

我在 WPF 应用程序中编写了一些代码,如下所示:

var dialog = new OpenFileDialog { Filter = this.FileExtensionFilter };
var dialogResult = dialog.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
    ... Process result of dialog ...
}

一切都很好,我想,但 ReSharper 在检查 dialogResult.HasValue 时提出了警告,“表达式始终为真”。

第一个问题是 ReSharper 是如何知道 dialogResult 总是有结果的——它一定已经深入到 Microsoft.Win32.OpenFileDialog 类的反编译代码中并观察到它永远不会返回 null。要么这样,要么只是专门针对此类的硬编码警告。

其次,假设结果永远不会为空似乎不是一个好习惯。如果 Microsoft 发布了可以使用空值的库的未来版本怎么办?关于此事的文档说:"In the current implementation, the derived classes (OpenFileDialog and SaveFileDialog) will only return true or false" 这确实意味着这不是我们可以永远依赖的永久安排。

对于我是否过于谨慎,是否应该按照 ReSharper 的建议删除该行有什么想法?

【问题讨论】:

    标签: c# wpf resharper nullable openfiledialog


    【解决方案1】:

    看起来确实很奇怪。 MSDN 规范声明它将返回 true 或 false,但 Nullable 仍然必须有原因。

    我绝对同意你的观点,假设下面的实现是不好的做法。我会根据接口进行编码,所以在这种情况下,我认为检查 HasValue 是正确的方法。

    Re-sharper 是如何知道的?恐怕我无法回答这个问题。这不是我使用的东西,他们可能已经对其进行了硬编码。

    您可能对此感兴趣:When does Microsoft.Win32.OpenFileDialog.ShowDialog() return null?

    似乎有可能为 null 的原因是因为这是用户关闭对话框之前的结果。

    【讨论】:

      【解决方案2】:

      它是硬编码的。

      如果您查看 Program Files 中的 ReSharper 目录,您会看到许多名称中带有 Nullness.Gen 的 XML 文件,这些文件包含有关特定元素是否为/不是的规则null,这些用于显示警告,例如您看到的警告,它们不会正常显示。

      如果你在Bin\ExternalAnnotations.NETFramework\System.Windows中找到2.0.5.0.Nullness.Gen.xml文件,你会发现以下条目大约有一半一路下来:

      <member name="M:System.Windows.Controls.OpenFileDialog.ShowDialog">
          <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
      </member>
      

      然后您可以查看 bin 目录中的 JetBrains.Annotations 以查看 NotNullAttribute 的定义:

       <member name="T:JetBrains.Annotations.NotNullAttribute">
           <summary>
           Indicates that the value of the marked element could never be <c>null</c>
           </summary>
           <example><code>
           [NotNull] public object Foo() {
             return null; // Warning: Possible 'null' assignment
           }
           </code></example>
       </member>
      

      【讨论】:

      • 很好地回答了问题的另一半——我相信这是 JetBrains 的一个错误,并且仍然认为 API 不会返回 null 是一个非常糟糕的假设,它只是一个实现细节。
      • 也感谢您澄清这个 JMK。我同意@Ian,做出这样的硬编码假设似乎是不好的编程习惯。公共接口通常应该被视为黑匣子,如果它有一个可以为空的返回类型,你应该满足它。
      • 很遗憾我不能将两个答案都标记为已接受,因为它们各自回答了多个问题的不同部分!无论如何都赞成。
      • @Ian 的回答更有用,所以我不抱怨 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2018-12-13
      • 2013-05-09
      • 2014-04-13
      • 2012-04-08
      相关资源
      最近更新 更多