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;
}
}