1)Nullable類型
一個Nullable類型就是基本類型加上一個“是否為null指標”的合成類型。對於一個類型,如果既可以給它分配一個值,也可以給它分配null引用(表示沒有任何值),我們就說這個類型是可以空的。因此,可空類型可表示一個值,或表示不存在任何值。例如,類似String的參考型別就是可空類型,而類似Int32的實值型別不是可空類型。由於實值型別的容量只夠表示適合於該類型的值,因此它不可為空白。
有些人認為int型變數的值為0就表示空,這是不對的,0也是它的值,而並不表示空。
看下面的代碼示範:
1 static void Main(string[] args) 2 { 3 //int n = null; 4 //當直接給int類型賦值null時,編譯器報錯“無法將Null型轉化為int型,因為它是一種不可以為null型的類型” 5 int? oneValue = null; 6 //定義Nullable類型和定義非Nullable類型非常相似,關鍵在於類型後面的修飾符“?” 7 //int? oneValue = 10; 8 if (oneValue.HasValue)//使用Nullable類型的HasValue屬性來判定是否有值儲存 9 {10 //int nNum = oneValue;11 //如果嘗試擷取oneValue的值,編譯器就會報錯12 Console.WriteLine(oneValue.Value);13 }14 else15 {16 Console.WriteLine("oneValue的值為空白!");17 }18 }
2)C#的溢出檢查
當一種整型轉換到另一種整型,這個過程取決於溢出檢查上下文。checked關鍵字用於對整型算術運算和轉換顯式啟用溢出檢查,而unchecked關鍵字則用於取消整型算術運算和轉換的溢出檢查。
①啟用溢出檢查:當運算元的值在目標類型的取值範圍內,則轉換成功,否則將要拋出異常。
看下面代碼示範:
1 class TypeConvert 2 { 3 static void Main(string[] args) 4 { 5 TypeConvert typeConvert = new TypeConvert(); 6 typeConvert.DoSomething(); 7 } 8 9 public void DoSomething()10 {11 //MyInt的值為214748364712 try13 {14 int MyInt = int.MaxValue;15 byte MyByte = checked((byte)MyInt);16 }17 catch(OverflowException)18 {19 throw;20 }21 }22 }
在代碼中MyInt的最大值是2147483647,在強制轉換為byte類型後,由於byte的取值範圍為0-255,在這裡使用了checked關鍵字進行了溢出檢查,這裡的byte型MyByte型無法容納遠大於其容量的值而拋出異常。
②取消溢出檢查
在類型轉換的過程中不檢查資料是否超過目標資料類型的最大值,意味著類型轉換永遠是成功的。如果來源資料類型的取值範圍大於目標類型的取值範圍,超過的部分將會被截取掉;如果來源資料的取值範圍小於目標類型的,轉換後將使用符號或者零填充至與目標類型的大小相等;如果等於,則直接轉換成目標類型
看執行個體代碼如下:
1 1 class TypeConvert 2 2 { 3 3 static void Main(string[] args) 4 4 { 5 5 TypeConvert typeConvert = new TypeConvert(); 6 6 typeConvert.DoSomething(); 7 7 } 8 8 9 9 public void DoSomething()10 10 {11 11 //MyInt的值為214748364712 12 try13 13 {14 14 int MyInt = int.MaxValue;15 15 //byte MyByte = unchecked(byte)MyInt;16 16 //這樣寫與下面的寫法一樣,區別就是生命了關鍵字17 17 byte MyByte = (byte)MyInt;18 18 //這裡沒有使用溢出檢查,結果也不會拋出異常。但是轉換的結果是有問題的,是byte類型的最大值255,與原始的值相差很大。19 19 }20 20 catch(OverflowException)21 21 {22 22 throw;23 23 }24 24 }25 25 }
③typeof運算子
typeof是一元運算子,用於返回任意一個類型的類型資訊
typeof運算子的文法如下: Type type=typeof(類型);
範例程式碼示範如下:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Type t = typeof(Program); 6 Console.WriteLine("方法:"); 7 8 MethodInfo[] methodInfo = t.GetMethods(); 9 //返回該Type類型的所有公用方法10 foreach (MethodInfo mInfo in methodInfo)11 {12 Console.WriteLine(mInfo.ToString());13 }14 15 Console.WriteLine("成員:");16 MemberInfo[] memberInfo = t.GetMembers();17 //返回該Type類型的所有公用成員18 foreach (MemberInfo mInfo in methodInfo)19 {20 Console.WriteLine(mInfo.ToString());21 }22 23 Console.ReadKey();24 }25 }
運行結果如:
④運算子的重載
運算子多載只能應用於類或結構。要重載一個運算子,可以聲明一個名為operator X的方法並實現它,如operator +和operator -,一元運算子和二元運算子都可以被重載,相應地,重載方法分別帶一個或者兩個參數(類或者結構類型),其文法為:
//一元運算子的重載
public static 自訂類型 operator 要重載的運算子(類型)
//二元運算子的重載
public static 自訂類型 operator 要重載的運算子(類型1,類型2)
注意:所有運算子的重載均是靜態方法,必須得用public修飾
程式碼範例如下:
1 class Program 2 { 3 public int Value { get;set; } 4 5 static void Main(string[] args) 6 { 7 Program o1 = new Program(); 8 o1.Value = 10; 9 Program o2 = new Program();10 o2.Value = 20;11 12 Program o3 = o1 + o2;13 Console.WriteLine(o3.Value);14 Console.ReadKey();15 }16 17 /// <summary>18 /// 這裡為Program類重載了“加(+)”運算子實現了兩個對象的相加的功能,運算子的重載提高了編程的便利性19 /// </summary>20 /// <param name="o1"></param>21 /// <param name="o2"></param>22 /// <returns></returns>23 public static Program operator +(Program o1, Program o2)24 {25 Program o = new Program();26 o.Value = o1.Value + o2.Value;27 return o;28 }29 }