您好,登錄后才能下訂單哦!
如何理解C#可空值類型,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
通常一個值類型變量永遠(yuǎn)不可能為null,它總是包含值類型的值本身。但是在某些情況下會遇到一些問題如:在映射數(shù)據(jù)庫中的一個C#可空值列時,使用Framework來處理數(shù)據(jù)庫數(shù)據(jù)時變得相當(dāng)困難;為了解決這一問題CLR中引入了“C#可空值類型(nullable value type)”
為理解它們是如何工作的,先看看CLR中的邏輯:
[Serializable, StructLayout(LayoutKind.Sequential)] public struct Nullable< T> where T : struct { private Boolean hasValue = false; // 用一個字段落表示裝態(tài),初始假定為Null internal T value = default(T); public Nullable(T value) { this.value = value; this.hasValue = true; } public bool HasValue { get { return hasValue; } } public T Value { get { if (!hasValue) throw new InvalidOperationException("Nullable object must have a value."); return value; } } public T GetValueOrDefault() { return value; } public T GetValueOrDefault(T defaultValue) { if (!HasValue) return defaultValue; return value; } public override bool Equals(object obj) { if (!HasValue) return (obj == null); if (obj == null) return false; return value.Equals(obj); } public override int GetHashCode() { if (!HasValue) return 0; return value.GetHashCode(); } public override string ToString() { if (!HasValue) return String.Empty; return value.ToString(); } public static implicit operator Nullable< T>(T value) { return new Nullable< T>(value); } }
調(diào)用和輸出:
static void Main(string[] args) { Nullable< Int32> x = 5; Nullable< Int32> y = null; Console.WriteLine("x:HasValue {0}, value = {1}", x.HasValue, x.Value); Console.WriteLine("y:HasValue {0}, value = {1}", y.HasValue, y.GetValueOrDefault()); Console.ReadLine(); } 輸出: x:HasValue True, value = 5 y:HasValue False, value = 0
C#中允許使用問號來申明初始化變量(等同于上面代碼)如:
Int32? x = 5;
Int32? y = null;
總結(jié)一下C#可空值類型對操作符的解釋:
a.一元操作符如果操作數(shù)為null,結(jié)果為null;
b.二元操作符中任何一個為null,結(jié)果為null;
c.比較操作符如果兩人個操作數(shù)都為null,兩者相等;如果一個為null,兩者不相等;如果兩個數(shù)都不為null,對值進(jìn)行比較;
注意:在操作值類型時會生成大量代碼,代碼類似對基類(Nullable)代碼的調(diào)用;
//一元操作符:(+ ++ - -- ! ~) x++; // x = 6; y--; // y = null; //二元操作符:(+ - * / % & | ^ < < >>) x = x + 10; // x = 15; y = y * 10; // y = null // 比較操作符:(== != < > < = >=) if (x == null) Console.WriteLine("x is null;"); else Console.WriteLine("x is not null;"); if (y == null) Console.WriteLine("y is null;"); else Console.WriteLine("y is not null;"); if (x != y) Console.WriteLine("x = y;"); else Console.WriteLine("x != y;"); if (x > y) Console.WriteLine("x > y;"); else Console.WriteLine("x < = y;");
當(dāng)CLR對一個Nullable< T>實例進(jìn)行裝箱時,會檢查它是否為null,如果為null,CLR不實際進(jìn)行裝箱操作,并會返回null值;
如果實例不為空,將從類型中取出值,并對其進(jìn)行裝箱如:
Int32? a = null; object o = a; //a 為null Console.WriteLine(" o is null = {0}", o == null); // "true" Int32? b = 5; o = b; //a 為null Console.WriteLine(" o's type = {0}", o.GetType()); // "System.Int32" 對可空值類型調(diào)用GetType時CLR會采取欺騙手法返回T,而不是Nullable< T>
在應(yīng)用可空值類型進(jìn)行拆箱時,CLR會分配內(nèi)存(這是一個極特殊的行為,在其它所有情況下,拆箱永遠(yuǎn)不會導(dǎo)致內(nèi)存的分配),原因在于一個已裝箱的值類型不能簡單的拆箱為值類型的可空版本,在已裝箱的值類型中并不包含Boolean hasValue字段,故在拆箱時CLR必須分配一個Nullable< T>對象,已初始化hasValue = true ,value = 值類型值。這會對應(yīng)用程序性能造成一定影響。
通過C#可空值類型調(diào)用接口方法
Int32? n = 5; Int32 result = ((IComparable)n).CompareTo(5); Console.WriteLine(result); // 0;
關(guān)于如何理解C#可空值類型問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。