1. 裝箱與拆箱
c#的資料型別分為基本型別和引用型別兩種,將基本型別轉成引用型別的過程,稱之為「裝箱」;將引用型別轉成基本型別的過程,稱之為「拆箱」,「裝箱」的過程,會在記憶體的堆中建立乙個基本型別的副本,請看以下**(**來自msdn):
class
testboxing
", i);
system.console.writeline(
"the object-type value =
", o);}}
/*output:
the value-type value = 456
the object-type value = 123*/
這個例子很好的說明了「裝箱」後的變數的位址和原有變數的位址是不一樣的,即「裝箱」的過程中建立了乙個原有變數的副本。
2. 隱式轉換與顯示轉換
關於型別之間需要進行轉換的主要原因,在於物件導向的兩個主要特性:繼承和多型。以父類型別宣告的變數,其實現可以指向子類,這個過程是不需要顯示表示的,稱之為隱式轉換;反過來的話,是需要在**中顯示的,稱之為「顯示轉換」。
3. as和is的使用
由於在型別轉換的過程中如果使用a = (int)x;這種形式時,很可能會觸發invalidcastexception,為了避免這種情況,產生了as和is。如果只是需要判斷變數是否是某一型別,而不需要真正轉換時,我們可以使用is操作符;如果我們需要將變數轉換成某一種型別,我們可以使用as。is返回bool值,代表變數是否是某一型別的;as使用時,如果轉換成功,返回轉換後的結果,如果轉換失敗,返回null。請看以下**(**來自msdn):
class
safecasting
public
override
string
tostring()
}class
mammal : animal
class
giraffe : mammal
class
supernova
static
void
=new
safecasting();
//use the is operator to verify the type.
//before performing a cast.
giraffe g
=new
//use the as operator and test for null
//before referencing the variable.
//use the as operator to test
//an incompatible type.
supernova sn
=new
//use the as operator with a value type.
//note the implicit conversion to int? in
//the method body.
inti =5
doubled =
9.78654
//keep the console window open in debug mode.
system.console.writeline(
"press any key to exit.");
system.console.readkey();
}void
useisoperator(animal a)
}void
useasoperator(
object
o)else
is not a mammal
", o.gettype().name);}}
void
useaswithnullable(system.valuetype val)
else}}
上述**的執行結果如下:
eating.
i am an animal.
supernova
isnot a mammal
5could not convert
9.78654
press any key to exit.
4. convert類與型別轉換
如果我們面臨乙個問題:將乙個字串轉換為int型別,你能想到幾種實現方式呢?請看以下**:
//將乙個字串轉換為int
string
str ="
29";//
方法一:使用convert類
intnumval
=convert.toint32(str);
numval++;
//方法二:使用int32.parse方法
intnumval
=int32.parse(str);
console.writeline(numval);
//方法三:使用int32.tryparse方法
intj;
int32.tryparse(
"-105",
outj);
console.writeline(j);
關於parse方法和tryparse方法,以下**說明了兩者的不同:
//使用parse方法
trycatch
(formatexception e)
//output: input string was not in a correct format.
//使用tryparse方法
string
inputstring ="
abc"
;int
numvalue;
bool
parsed
=int32.tryparse(inputstring,
outnumvalue);if(
!parsed)
console.writeline(
"int32.tryparse could not parse '' to an int.\n
", inputstring);
//output: int32.tryparse could not parse 'abc' to an int.
5. bitconverter類的使用
bitconverter類主要用來將基礎資料型別與位元組陣列相互轉換。例如,當我們在網路上接收到的資料一般都是位元組陣列,在實際的應用程式中,我們可能需要將其轉換成其他型別,請看以下**:
byte
bytes =;
//if the system architecture is little-endian (that is, little end first),
//reverse the byte array.
if(bitconverter.islittleendian)
array.reverse(bytes);
inti
=bitconverter.toint32(bytes, 0);
console.writeline(
"int:
", i);
//output: int: 25
還有以下**:
string
hexstring ="
43480170";
uint
num
=uint
.parse(hexstring, system.globalization.numberstyles.allowhexspecifier);
byte
floatvals
=bitconverter.getbytes(num);
floatf =
bitconverter.tosingle(floatvals, 0);
console.writeline(
"float convert =
", f);
//output: 200.0056
6. 總結
(1) 型別轉換是程式語言中乙個基本的知識,轉換的方式也是靈活多變的,我們需要很好的掌握,基礎很重要。
(2) 善用msdn。
string
hexstring ="
43480170";
uint
num
=uint
.parse(hexstring, system.globalization.numberstyles.allowhexspecifier);
byte
floatvals
=bitconverter.getbytes(num);
floatf =
bitconverter.tosingle(floatvals, 0);
console.writeline(
"float convert =
", f);
//output: 200.0056
C 基礎(1) 型別轉換
1.裝箱與拆箱 c 的資料型別分為基本型別和引用型別兩種,將基本型別轉成引用型別的過程,稱之為 裝箱 將引用型別轉成基本型別的過程,稱之為 拆箱 裝箱 的過程,會在記憶體的堆中建立乙個基本型別的副本,請看以下 來自msdn class testboxing i system.console.writ...
C 基礎(12)型別轉換
我於昨晚去世,走時心如止水。我於今早重生,來時心懷暖陽。型別轉換 cast 是將一種資料型別轉換成另一種資料型別。例如,如果將乙個整型值賦給乙個浮點型別的變數,編譯器會暗地裡將其轉換成浮點型別。轉換是非常有用的,但是它也會帶來一些問題,比如在轉換指標時,我們很可能將其轉換成乙個比它更大的型別,但這可...
C 基礎06 型別轉換
系統自動進行,無需開發人員介入。int main 2.1 c語言風格的強制型別轉換int main 2.1.2 c 的強制型別轉換 通用形式 強制型別轉換名 express type 轉換的目標型別 express 需要轉換的變數 2.1.2.1 static cast int main b 類中子...