检查 OpenFileDialog 的可为空结果
本文关键字:结果 OpenFileDialog 检查 | 更新日期: 2023-09-27 18:37:12
我在 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发布库的未来版本,其中 null 值确实可用,该怎么办?关于此事的文档说:"在当前的实现中,派生类(OpenFileDialog和SaveFileDialog)只会返回true或false",这确实意味着这不是我们可以永远依赖的永久安排。
关于我是否过于谨慎并且应该按照 ReSharper 的建议删除该行的任何想法?
这看起来确实很奇怪。MSDN 规范声明它将返回 true 或 false,但仍然必须有一个 Nullable 的原因。
我绝对同意你的看法,假设下面的实现是不好的做法。我会根据界面进行编码,所以在这种情况下,我认为检查 HasValue 是正确的方法。
Re-Sharper如何知道?恐怕我无法回答这个问题。这不是我使用的东西,他们可能已经硬编码了它。
您可能会对此感兴趣:Microsoft.Win32.OpenFileDialog.ShowDialog() 何时返回 null?
似乎存在 null 可能性的原因是因为这是用户关闭对话框之前的结果。
它是硬编码的。
如果你在程序文件中查看ReSharper目录,你会看到很多XML文件的名称中带有Nullness.Gen,这些文件包含有关特定元素是否为/不是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>