1. 程式人生 > 實用技巧 >C#資料型別介紹

C#資料型別介紹

本篇內容來自https://developer.51cto.com/art/201106/267635.htm

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

1.1 值型別

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

  • 簡單型別(Simple types )
  • 結構型別(struct types)
  • 列舉型別(Enumeration types)

1.1.1 簡單型別

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

  • 整型
  • 布林型
  • 字元型 (整型的一種特殊情況)
  • 浮點型
  • 小數型

1.1.1.1 整型

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

  • sbyte型為有符號8位整數,取值範圍在128~127之間。
  • bytet型為無符號16位整數,取值範圍在0~255之間。
  • short型為有符號16位整數,取值範圍在-32,768~32,767之間。
  • ushort型為無符號16位整數,取值範圍在0~65,535之間。
  • int型為有符號32位整數,取值範圍在-2,147,483,648~ 2,147,483,647之間。
  • uint型為無符號32位整數,取值範圍在 0 ~ 4,294,967,295之間。
  • long型為64位有符號整數,取值範圍在9,223,372,036,854,775,808~ 9,223,372,036,854,775,807之間。
  • ulong型為64位無符號整數,取值範圍在0 ~ 18,446,744,073,709,551,615之間。

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;   
int nSomeInt = (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 位數。

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

  • 正零和負零
  • 正無窮和負無窮
  • 非數字值(Not-a-Number,縮寫NaN)
  • 非零值的有限數集

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

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   
{   
  public byte b1,b2,b3,b4;   
}   
class Test   
{   
  public static void Main()   
  {   
    IP myIP;   
    myIP.b1 = 192;   
    myIP.b2 = 168;   
    myIP.b3 = 1;   
    myIP.b4 = 101;   
    Console.Write("{0}.{1}.",myIP.b1,myIP.b2);   
    Console.Write("{0}.{1}",myIP.b3,myIP.b4);   
  }   
}  

1.1.3 列舉型別

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

enum MonthNames { January, February, March, April };  

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

enum MonthNames { January=1, February, March, April };  

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

enum MonthNames { January=31, February=28, March=31, April=30 };  

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

enum MonthNames : byte { January=31, February=28, March=31, April=30 };  

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

1.2 引用型別

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

  • 物件型別
  • 類類 型
  • 介面
  • 代表元
  • 字串型別
  • 陣列

1.2.1 物件型別

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

object theObj = 123;  

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

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

1.2.2 類型別

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

希望對你有幫助。

【編輯推薦】

  1. c#.net實體類序列化方法
  2. C#中log4net使用方法(一)
  3. C#中log4Net使用方法(二)
  4. C#中的閉包是怎麼捕獲變數的
  5. 解析C#委託、時間和Lambda表示式