簡體   English   中英

在C#中使用可空類型

[英]Using nullable types in C#

我只是對人們的意見感興趣。 在C#中使用可空類型時,測試null的最佳實踐方法是什么:

bool isNull = (i == null);

要么

bool isNull = !i.HasValue;

同樣,當分配給非null類型時:

long? i = 1;
long j = (long)i;

優於:

long? i = 1;
long j = i.Value;

我會用這個:

long? i = 1;
...some code...
long j = i ?? 0;

這意味着,如果inull ,則將分配0。

使用C#團隊專門為您實現的表單。 如果有人反對,告訴他們安德斯說沒關系。

我輕蔑地說,很多工作都是將可空類型集成到c#中,以便為您提供良好的編程體驗。

請注意,就性能而言,兩種形式都會編譯為相同的IL,即:

int? i = 1;
bool isINull = i == null;
int j = (int)i;

在C#編譯器完成之后,這樣結束:

int? i = 1;
bool isINull = !i.HasValue;
int j = i.Value;

我總是使用(i == null)表單。 它表達了你在做什么。

WRT第二個問題,我認為任何一種形式都沒問題。 但是我總是首先檢查它是否為null並采取適當的操作 - 可能在輔助方法中包裝該檢查和操作(通常它只是設置一個默認值)。

我沒有在實踐中使用Nullable Types,但是對於第二種,我實際上建議使用j.GetValueOrDefault()。 文檔表明后者實際上會在null值的情況下拋出InvalidOperationException。 取決於explict強制轉換操作符的內部實現,前者可能也是如此。 我堅持使用GetValueOrDefault並適當地處理null / default情況。

我傾向於使用第一個,因為它需要在其生命周期的后期得到支持,這些似乎更容易理解原作者的意圖。

打開Reflector。 HasValue是對布爾標志的查找,該標志在值更改時設置。 因此,就周期而言,查找比比較更快。

public Nullable(T value)
{
    this.value = value;
    this.hasValue = true;
}

private bool hasValue;

internal T value;

public bool HasValue
{
    get
    {
        return this.hasValue;
    }
}

它們都是相同的,但我會在兩者上使用前一個版本,因為它在語言中更常見:與null比較並轉換為類型。

我通常傾向於傾向於兩個場景中的第一個選項,因為它更傾向於面向對象的“原始”(這實際上就是我們想要的),但它真的無關緊要

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM