2013-04-29 112 views
13

什麼是正確的檢查:比較默認還是空的?

Guid value; 
// ... 
if (value != Guid.Empty) 

if (value != default(Guid)) 

我覺得第二,但無法解釋爲什麼。

+3

嗯......你有什麼檢查? – Oded 2013-04-29 13:29:28

+0

第二個例子給你'使用未分配的局部變量'值'' – Default 2013-04-29 13:30:02

+4

'default(Guid)== Guid.Empty' – Oded 2013-04-29 13:30:16

回答

21

由於Guid.Empty == default(Guid)它並不重要,但我更喜歡Guid.Empty的可讀性。

+1

我認爲,從可讀性的角度來看,兩者都很好,這實際上取決於檢查的實際意義。檢查記錄是否處於默認狀態與檢查記錄是否包含空值(IMO)不同。 – James 2013-04-29 13:44:48

4

我要說的第二個純粹是因爲你必須在未初始化狀態的記錄,因此,它將包含默認值。您正在檢查變量是否處於默認狀態,而不是它是否爲空 - 兩種不同的檢查(IMO)。

Guid.Empty是相當於default(Guid)在.NET所以從它並不重要技術點,不過,比較Guid.Empty給我的印象是,你對一個特定值的檢查,而不是是否該記錄是默認狀態。

5

Guid.Empty相當於new Guid(),這也相當於default(Guid)

當你反編譯Guid結構時,似乎;

public static readonly Guid Empty = new Guid(); 

由於Guidstruct,從Default Values Table;

通過將所有值類型字段設置爲其默認值 值以及將所有引用類型字段設置爲空而生成的值。

由於字段類型Guid是,shortintbyte,(這類型的默認值是0),當我們使用default(Guid)我們得到了所有字段Guid0

Guid.Empty Field

一個只讀的GUID結構,其值是全零的實例。

當我們寫這段代碼;

Console.WriteLine(default(Guid)); 
Console.WriteLine(new Guid()); 

輸出;

00000000-0000-0000-0000-000000000000 
00000000-0000-0000-0000-000000000000 

如果你關心的可讀性(我想你應該)Guid.Empty似乎不如我。

+4

這是我做過的最不必要的解釋':)' – 2013-04-29 13:52:09

4

兩者都是一樣的!

Guid.Empty是Guid的只讀字段,其值爲{00000000-0000-0000-0000-000000000000}

隨着default(Guid)編譯創建一個常數值,有{00000000-0000-0000-0000-000000000000}

在這兩種情況下,您的值都會與內存中某個值進行比較。

爲了便於閱讀,請使用Guid.Empty
當您使用泛型時使用default(T)

2

爲了便於閱讀,我個人會使用Guid.Empty。我唯一真正使用default的時間是當沒有其他選項時,例如當檢查KeyValuePair時。

2

你應該使用下列內容:

var guidIsEmpty = value == Guid.Empty; 

兩者都是技術上正確的,但是,比較Guid.Empty肯定,使更多的可讀代碼。

0

我知道這是一個古老的線程,但只是想附和:

當定義一個GUID的默認值作爲參數傳遞給一個方法,你將不得不使用默認值(GUID),而不是的Guid .Empty,因爲Guid.Empty不被視爲編譯時常量。

這將編譯:

private void MyMethod(Guid id = default(Guid)) 

這不會編譯:

private void MyMethod(Guid id = Guid.Empty) 
+0

謝謝@Mekuri,但是這並不直接回答這個問題。您的文章作爲評論很棒,但沒有足夠的信息可以成爲SO的答案。 – 2017-12-13 14:30:35