C 值型別賦值與引用型別的賦值

2021-06-13 06:50:49 字數 3852 閱讀 8413

c#程式設計中,大家會經常使用到不同的資料型別,那麼c#程式語言到底有什麼型別呢?具體如下:

1.1 值型別

各種值型別總是含有相應該型別的乙個值。c#迫使你初始化變數才能使用它們進行計算-變數沒有初始化不會出問題,因為當你企圖使用它們時,編譯器會告訴你。 每當把乙個值賦給乙個值型別時,該值實際上被拷貝了。相比,對於引用型別,僅是引用被拷貝了,而實際的值仍然保留在相同的記憶體位置,但現在有兩個物件指向了它(引用它)。c#的值型別可以歸類如下:

1.1.1 簡單型別

在c#中出現的簡單型別共享一些特性。第一,它們都是.net系統型別的別名。第二,由簡單型別組成的常量表示式僅在編譯時而不是執行時受檢測。最後,簡單型別可以按字面被初始化。以下為c#簡單型別歸類:

1.1.1.1 整型

c#中有9個整型。 sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char(單獨一節討論)。它們具有以下特性:

vb和c程式設計師都可能會對int和long資料型別所代表的新範圍感到驚訝。和其它的程式語言相比,在c#中,int不再取決於乙個機器的字(word)的大小,而long被設成64位。

1.1.1.2 布林型

布林資料型別有true和false兩個布林值。可以賦於true或false值給乙個布林變數,或可以賦於乙個表示式,其所求出的值等於兩者之一:

bool

btest = (80 > 90);  

與c和c++相比,在c#中,true值不再為任何非零值。不要為了增加方便而把其它整型轉換成布林型。

1.1.1.3 字元型

字元型為乙個單unicode 字元。乙個unicode字元16位長,它可以用來表示世界上多種語言。可以按以下方法給乙個字元變數賦值:

char

chsomechar = 

'a';  

除此之外,可以通過十六進製制轉義符(字首\x)或unicode表示法給變數賦值(字首\u):

char

chsomechar = 

'\x0065'

;   

char

chsomechar = 

'\u0065'

;

不存在把char轉換成其它資料型別的隱式轉換。這就意味著,在c#中把乙個字元變數當作另外的整數資料型別看待是行不通的——這是c程式設計師必須改變習慣的另乙個方面。但是,可以運用顯式轉換:

char

chsomechar = (

char

)65;   

intnsomeint = (

int)

'a';  

在c中仍然存在著轉義符(字元含義)。要換換腦筋,請看錶4.1。

table 4.1 轉義符( escape sequences)

轉義符 字元名

\' 單引號

\" 雙引號

\\ 反斜槓

\0 空字元

\a 感嘆號(alert )

\b 退格

\f 換頁

\n 新行

\r 回車

\t 水平 tab

\v 垂直tab

1.1.1.4 浮點型

兩種資料型別被當作浮點型:float和double。它們的差別在於取值範圍和精度:

float: 取值範圍在 1.5x10^-45~ 3.4x10^38之間, 精度為7位數。

double: 取值範圍在 5.0x10^-324 ~ 1.7x10^308之間, 精度為 15~16 位數。

當用兩種浮點型執行運算時,可以產生以下的值:

另乙個運算規則為,當表示式中的乙個值是浮點型時,所有其它的型別都要被轉換成浮點型才能執行運算。

1.1.1.5 小數型(the decimal type)

小數型是一種高精度、128位資料型別,它打算用於金融和貨幣的計算。它所表示的範圍從大約1.0x10^-28 到 7.9x10^28,具有28至29位有效數字。要注意,精度是以位數 (digits)而不是以小數字(decimal places)表示。運算準確到28個小數字的最大值。

正如你所看到的,它的取值範圍比double的還窄,但它更精確。因此,沒有decimal和double之間的隱式轉換——往乙個方向轉換可能會溢位,往另外乙個方向可能會丟失精度。你不得不運用顯式轉換。

當定義乙個變數並賦值給它時,使用 m 字尾以表明它是乙個小數型:

decimal

decmyvalue = 1.0m;  

如果省略了m,在變數被賦值之前,它將被編譯器認作double型。

1.1.2 結構型別

乙個結構型別可以宣告建構函式、常數、字段、方法、屬性、索引、操作符和巢狀型別。儘管列出來的功能看起來象乙個成熟的類,但在c#中,結構和類的區別在於結構是乙個值型別,而類是乙個引用型別。與c++相比,這裡可以用結構關鍵字定義乙個類。

使用結構的主要思想是用於建立小型的物件,如point和fileinfo等等。你可以節省記憶體,因為沒有如類物件所需的那樣有額外的引用產生。例如,當宣告含有成千上萬個物件的陣列時,這會引起極大的差異。

清單4.1 包含乙個命名為ip的簡單結構,它表示乙個使用byte型別的4個字段的ip位址。我不包括方法等,因為這些工作正如使用類一樣,將在下一章有詳細的描述。

清單1.1 定義乙個簡單的結構

using

system;   

struct

ip   

class

test   

..",myip.b1,myip.b2);   

console.write(

".",myip.b3,myip.b4);   

}   

}

1.1.3 列舉型別

當你想宣告乙個由一指定常量集合組成的獨特型別時,列舉型別正是你要尋覓的。最簡單的形式,它看起來可能象這樣:

enum

monthnames ;  

因我慣用預設設定,故列舉元素是int型,且第乙個元素為0值。每乙個連續的元素按1遞增。如果你想給第乙個元素直接賦值,可以如下把它設成1:

enum

monthnames ;  

如果你想賦任意值給每個元素——甚至相同的值——這也沒有問題:

enum

monthnames ;  

最後的選擇是不同於int的資料型別。可以在一條語句中按如此賦值:

enum

monthnames : 

byte

;

你可以使用的型別僅限於long、int、short和byte。

1.2 引用型別

和值型別相比,引用型別不儲存它們所代表的實際資料,但它們儲存實際資料的引用。在c#中提供以下引用型別給你使用:

1.2.1 物件型別

物件型別是所有型別之母——它是其它型別最根本的基類。因為它是所有物件的基類,所以可把任何型別的值賦給它。例如,乙個整型:

object

theobj = 123;  

給所有的c++程式設計師乙個警告:object並不等價於你可能正在尋找的void*。無論如何,忘掉指標總是個好主意。

當乙個值型別被加框(作為乙個物件利用)時,物件型別就被使用了。這一章稍後會討論到加框和消框

1.2.2 類型別

乙個類型別可以包含資料成員、函式成員和巢狀型別。資料成員是常量、欄位和事件。函式成員包括方法、屬性、索引、操作符、建構函式和析構函式。類和結構的功能是非常相似的,但正如前面所述,結構是值型別而類是引用型別。

希望對你有幫助。

C 值型別賦值與引用型別的賦值

在c 中,資料型別大致可以分為兩類,一類是值型別,一類是引用型別。初學者往往會被型別之間的相互賦值搞的很迷惑,尤其是引用型別變數的相互賦值。現在舉2個例子,來一一說明。值型別變數的賦值 值型別變數中儲存的是實際資料,在賦值的時候只是把資料複製乙份,然後賦給另乙個變數。例子1 int var1 2 i...

01 基本型別的賦值與引用型別賦值的區別

var a 10 var b a console.log a的值是 a console.log b的值是 b 總結 基本型別的賦值 是把變數a的值 賦值乙份給b var obj1 var obj2 obj1 obj2.name 李四 console.log obj1的物件是 obj1 obj1的物件...

C 值型別和引用型別(未賦值的區域性變數)

引言 這部分內容還是很重要的,那麼是什麼讓我對值和引用型別著迷呢?我們先來看一下例子 這個是我們當時在討論設計模式的時候看到的,你們可以想想,為什麼會宣告null?直接宣告 expression expression 不行嗎?如果直接宣告 expression expression 會出現什麼情況?...