感覺寫隨筆第一天就遇到了困難,感覺好費時間啊,回宿舍就得8點多,然后只能看一點書。之后寫隨筆,首先得回憶,然后組織,最后打字。還有就是宿舍迎來的斷網的日子,特別不方便,只能第二天去公司發。本人目前是.net開發實習生,之前零零散散學了些.net知識,如今打算好好鞏固下C#,看了《C#高級編程》后感覺知識龐大,還有好些分支沒掌握,雖然不知道有些東西值不值得學習,還是先學著吧。
好了,步入正題:從《C#高級編程》第7章運算符和類型強制轉換開始
類型的安全性
類型轉換
首先看一段代碼:
Byte value1=10;
Byte value2=20;
Byte total=value1+value2;
Console.WriteLine(total);
初看似乎沒有錯誤,但此時VS會彈出下面一段錯誤提示:
錯誤 : 無法將類型“int”隱式轉換為“byte”。存在一個顯式轉換(是否缺少強制轉換?)
這是因為byte只能為8位,兩個byte類型相加很容易得到超出8位大小的數值,這體現了C#類型的強安全性;
這時,把Byte total=value1+value2;
改為Byte value3 = (byte)(value1 + value2); //顯示轉換
或者Int value3 = value1 + value2; //隱士轉換
以上就用到了兩種類型轉換,隱式轉換和顯式轉換
隱式轉換:
就是從較小的數據類型可以轉換為較大的數據類型
注意:
無符號的變量可以轉換為有符號的變量,只要無符號的變量值在有符號的變量值內即可
·要類型轉換中的可空類型(類型符后面帶“?”,可空類型就是允許為Null的類型):
·可空類型轉換規則遵循非可空類型的轉換規則,即較小類型向較大類型轉換
·非可空類型可以隱式轉換為可空類型,但可空類型不能隱式轉換為非可空類型。這是因為可空類型值允許為null,但非可空類型不允許為null。
顯式轉換:
就是強制轉換,要說的就是數值溢出的問題
例如:
long val=3000000000;
int i=(int)val;
算術溢出,可以用unchecked和checked檢測
默認情況下是unchecked,即對數值溢出不檢測
使用checked,會迫使運行時拋出異常:
long val=3000000000;
int i=checked((int)val);
或者checked用{}包住需要驗證溢出的語句
Checked
{
int i=checked((int)val);
}
后面還會用異常 try}{} catch{}來引入異常處理
之前提到的,可空類型轉換為非可空類型,必須用到顯示轉換。如int?轉換為int。這是因為可空類型允許為null。
如果可空類型為null,轉換為非可空類型,就會拋出異常。
int? a=null;
int b=(int)a; //將拋出異常
如果需要在數字和字符串之間轉換,可以試用.Net類庫中提供的方法:ToString();
int i=10;
string s=i.ToString();
關于類型轉換,.Net還提供了兩種安全帶轉換方法:Parse()和Convert方法。
例如:
string someString = "22";
int value1 = Int32.Parse(someString);
int value2 = Convert.ToInt32(someString);
還提到了一點,就是裝箱與拆箱。
裝箱,就是把值類型轉換為引用類型Object類型。而拆箱就是把Object類型重新轉換為值類型。
例:
int myInt=10;
object myObject=myInt; //裝箱,值類型都可以轉換為引用Object類型
int myInt2=(int)myObject; //拆箱,裝箱的相反過程,需要強制轉換
裝箱,拆箱可用于:比如一個方法需要引用類型參數,此時把值類型裝箱成為引用類型,之后可拆箱為值類型。
23:37,今天先寫到這了,由于看書的時間本身就比較晚,之后寫隨筆的進度比較慢,遠遠落后于看書的進度。留下了點小尾巴,是關于 比較對象之間的相等性 的。
明天接著寫運算符的重載。
以后會爭取每天寫一點C#學習的內容分享,也希望大家一起努力,把C#發揚光大,哈哈。歡迎多多指教!
新聞熱點
疑難解答