C 基礎(1) 型別轉換

2021-09-05 20:23:55 字數 4452 閱讀 1582

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 類中子...