1、我們知道任何一門編程語言均有相關數據類型。C#也不例外,其基本數據類型有int,short,long,float,double,string等。數據類型之間可以相互轉換。不過轉換過程要注意小類型能轉換成大類型,但大類型一般不能轉換成小類型。如int型可以轉換成float型,但float型不一定可以轉換成int型,至少這在C,C++是這樣,但在C#中明顯有了改變,似乎微軟公司也允許這樣的形式存在了。例如:
double dbl_num=12345678910.456;
int k = (int) dbl_num ;//此處運用了強制轉換
以上代碼如果在C,C++中強制轉換成int型,肯定會出錯,但現在在C#中卻不會出錯了,不過轉換后的值往往是溢出值,是不精通的。這點需要大家注意。
2、用另一種方式轉換類型,如int.parse(),int32.parse()等采用方法來轉換.
如string str=”100″;
int i=int.Parse(str);
注意:str除掉引號的類型必須和*.Parse的類型一致。如果將100改成100.78,即變成float類型,運行時將會報錯”輸入字符串的格式不正確.”
3、用后綴式轉換,如k.toString(),一般運用於字符串或日期等其它類型
int i=100;
string s=i.ToString();
4、采用Convert類來實現轉換,該類基本支持所以類型之間的轉換
string str=”100″;
int i = Convert.ToInt16(str);
注意:str除掉引號的類型必須和Convert.*的類型一致。如果將100改成100.78,即變成float類型,運行時將會報錯”輸入字符串的格式不正確.”
下面做一個深入的認識:
1、隱式轉換(自動轉換):由於該轉換是一種安全類型的轉換,不會導致數據丟失,因此不需要任何特殊的語法。 例如,從較小整數類型到較大整數類型的轉換以及從派生類到基類的轉換都是這樣的轉換。
對於內置數值類型,如果要存儲的值無需截斷或四舍五入即可適應變量,則可以進行隱式轉換。 例如,long 類型的變量(8 字節整數)能夠存儲 int(在 32 位計算機上為 4 字節)可存儲的任何值。 在下面的示例中,編譯器先將右側的值隱式轉換為 long 類型,再將它賦給 bigNum。
例:
C#
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
2、顯式轉換(強制轉換):顯式轉換需要強制轉換運算符。 在轉換中可能丟失信息時或在出於其他原因轉換可能不成功時,必須進行強制轉換。典型的例子包括從數值到精度較低或范圍較小的類型的轉換和從基類實例到派生類的轉換。
但是,如果進行轉換可能會導致信息丟失,則編譯器會要求執行顯式轉換,顯式轉換也稱為“強制轉換”。 強制轉換是顯式通知編譯器您打算進行轉換且您知道可能會發生數據丟失的一種方式。 若要執行強制轉換,請在要轉換的值或變量前面的圓括號中指定要強制轉換到的類型。 下面的程序將 double 強制轉換為 int。 如不強制轉換則該程序不會進行編譯。
例:
C#
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
(1)(int)變量名[強制類型轉換]:
該轉換方式主要用於數字類型轉換,從int類型到long,float,double,decimal類型,可以使用隱式轉換,但是從long類型到int類型就需要使用顯式轉換,也就是該數據類型轉換方式,否則會產生編譯錯誤。
該方式對於浮點數會做無條件舍去,失去精確度
當然,該方式也可以進行object到int得轉換,但是,object的值要賦予int類型的值,否則會產生編譯錯誤,而且object為null時也會出錯。
最后切忌的一點,千萬不要用來處理char類型到int類型的轉換,否則傳回的的值是ASCII代碼,而並不是你想要的值。
(2)int.Parse(string類型變量名)
該方式是將數字內容的字符串轉為int類型,如果字符串內容為空或者null時,則拋出ArgumentNullException異常;如果字符串內容不是數字,則拋出FormatException異常;如果字符串內容所表示數字超出int類型可表示的范圍,則拋出OverflowException異常。
使用該方法切忌的一點就是只能處理字符串內容,而且字符串內容只能在int類型可表示的范圍之內。
(3)int.TryParse(string s, out int result)
該方式也是將數字內容的字符串轉為int類型,但是該方式比int.Parse優越的地方,就是它不會出現異常。如果轉換成功返回 true,如果轉換失敗返回 false。很明顯,最后一個參數為輸出值,如果轉換失敗,輸出值為 0;如果轉換成功,則輸出相應的值。
(4)Convert.ToInt32
該方式不僅可以將字符串轉為int類型,還可以將其它類型的值轉成int類型。變量若為object或string類型,當其值為null時,會傳回0,不會造成程序錯誤,但是若此string類型的值為string.Empty,在轉型成int時,仍會造成程序錯誤。
該方式對於浮點數會做四舍五入。
該方式同強制轉換一樣,不能用來處理char類型,否則傳回的是ASCII代碼。
3、用戶定義的轉換:可以定義一些特殊的方法來執行用戶定義的轉換,從而使不具有基類–派生類關系的自定義類型之間可以顯式和隱式轉換。
4、使用幫助程序類的轉換:若要在不兼容的類型之間進行轉換,例如在整數與 System.DateTime 對象之間轉換,或者在十六進制字符串與字節數組之間轉換,則可以使用System.BitConverter 類、System.Convert 類和內置數值類型的 Parse 方法,例如 Int32.Parse。
下面具體就C#中的幾種強制轉換方法做一下比較,(int)、int.Parse()、int.TryParse、Convert.ToInt32的區別
1、(int)變量名[強制類型轉換]:
該轉換方式主要用於數字類型轉換,從int類型到long,float,double,decimal類型,可以使用隱式轉換,但是從long類型到int類型就需要使用顯式轉換,也就是該數據類型轉換方式,否則會產生編譯錯誤。
該方式對於浮點數會做無條件舍去,失去精確度
當然,該方式也可以進行object到int得轉換,但是,object的值要賦予int類型的值,否則會產生編譯錯誤,而且object為null時也會出錯。
最后切忌的一點,千萬不要用來處理char類型到int類型的轉換,否則傳回的的值是ASCII代碼,而並不是你想要的值。
2、 int.Parse(string類型變量名)
該方式是將數字內容的字符串轉為int類型,如果字符串內容為空或者null時,則拋出ArgumentNullException異常;如果字符串內容不是數字,則拋出FormatException異常;如果字符串內容所表示數字超出int類型可表示的范圍,則拋出OverflowException異常。
使用該方法切忌的一點就是只能處理字符串內容,而且字符串內容只能在int類型可表示的范圍之內。
3、int.TryParse(string s, out int result)
該方式也是將數字內容的字符串轉為int類型,但是該方式比int.Parse優越的地方,就是它不會出現異常。如果轉換成功返回 true,如果轉換失敗返回 false。很明顯,最后一個參數為輸出值,如果轉換失敗,輸出值為 0;如果轉換成功,則輸出相應的值。
例如:1.將字符串“12345”轉換成數值數據12345,實現如下:
bool=ryParse("12345",int result);
bool=true;
result=12345; //成功
4、Convert.ToInt32
該方式不僅可以將字符串轉為int類型,還可以將其它類型的值轉成int類型。變量若為object或string類型,當其值為null時,會傳回0,不會造成程序錯誤,但是若此string類型的值為string.Empty,在轉型成int時,仍會造成程序錯誤。
該方式對於浮點數會做四舍五入。
該方式同強制轉換一樣,不能用來處理char類型,否則傳回的是ASCII代碼。
該類的方法都是靜態方法,可以通過“Convert.方法名(參數)”形式來使用,其中常用的方法如下表所示。
方法 | 說明 |
Convert.ToBoolean(var) | var轉換為bool |
Convert.ToChar(var) | var轉換為char |
Convert.ToDecimal(var) | var轉換為decimal |
Convert.ToDouble(var) | var轉換為double |
Convert.ToInt32(var) | var轉換為int |
Convert.ToString(var) | var轉換為string |
例如:1.將字符串“12345”轉換成數值數據12345,實現如下:
Convert.ToInt32("12345");
2.將小數型“3.14”轉換成整數型數據,實現如下:
Convert.ToInt32(3.14);
3.將字符型'true'轉換成布爾型數據,實現如下:
Convert.ToInt32('true');