2013-10-29 130 views
4

的爲空的結果我已經寫在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建議刪除該行的想法?

回答

3

看起來很奇怪。 MSDN規範指出它將返回true或false,但仍然必須存在Nullable的原因。

我絕對同意你的看法,假設下面的實現是不好的做法。我會根據接口進行編碼,所以在這種情況下,我認爲檢查HasValue是正確的方法。

Re-sharper如何知道?恐怕我無法回答。這不是我使用的,他們可能已經硬編碼了。

這可能是你的興趣:When does Microsoft.Win32.OpenFileDialog.ShowDialog() return null?

似乎有空的possbility的原因是因爲這是導致用戶關閉對話框之前。

3

它是硬編碼的。

如果您在Program Files文件ReSharper的目錄看,你會看到很多的XML文件與Nullness.Gen的名稱,這些包含關於特定元素是否是規則/不爲空,而這些用於顯示警告,例如您正在看到的警告,他們不會正常顯示。

如果您發現2.0.5.0.Nullness.Gen.xml文件斌\ ExternalAnnotations.NETFramework \ System.Windows,你會發現大約按下一半以下條目:

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

然後你可以看一下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> 
+0

回答問題的另一半的好工作 - 我相信這是JetBrains的一個錯誤,它是一個非常糟糕的假設,仍然API不會返回null,它只是一個實現細節。 – Ian

+0

非常感謝您澄清此JMK。我同意@Ian的看法,這似乎是不好的編程習慣,就像這樣做硬編碼的假設。公共接口通常應該被視爲黑盒子,如果它具有可爲空的返回類型,你應該迎合這一點。 –

+0

這是一個恥辱,我不能標記兩個答案被接受,因爲他們每個回答多個問題的不同部分!無論如何都可以調高。 –