[英]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;
這意味着,如果i為null ,則將分配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.