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