1. 程式人生 > >c#中資料型別及轉換

c#中資料型別及轉換

值型別:(13種)
a.值型別變數可以直接分配給一個值。它們是從 類 System.ValueType 中派生的。
b.值型別直接儲存其值
c. 值型別的例項通常是線上程棧上分配的(靜態分配),但 是在某些情形下可以儲存在堆中
d. 值型別總是分配在它宣告的地方:作為欄位時,跟隨其所 屬的變數(例項)儲存;作為區域性變數時,儲存在棧上。棧 的記憶體是自動釋放的。
e. 值型別在記憶體管理方面具有更好的效率,並且不支援多型, 適合用做儲存資料的載體。
f. C#的值型別包括:結構體(數值型別、bool 型、使用者定義 的結構體),列舉,可空型別。

引用型別(Reference types) :

(2種)
a. 引用型別不包含儲存在變數中的實際資料,但它們包含對 變數的引用。繼承自 System.Object 類。

b. 引用型別儲存對其值的引用。它們指的是一個記憶體位置。 使用多個變數時,引用型別可以指向一個記憶體位置。如果 記憶體位置的資料是由一個變數改變的,其他變數會自動反 映這種值的變化。

c. 引用型別當宣告一個類時,只在棧中分配一小片記憶體用於容納一個地址,而此時並沒有為其分配堆上的記憶體空間。 當使用 new 建立一個類的例項時,分配堆上的空間,並把 堆上空間的地址儲存到棧上分配的小片空間中。

d. 引用型別的物件總是在程序堆中分配(動態分配)。

e. 引用型別在棧中儲存一個引用,其實際的儲存位置位於託 管堆。簡稱引用型別部署在託管推上。 (

堆記憶體是.NET 中會 由 GC 來自動釋放)。

f. 引用型別可以派生出新的型別,而值型別不能,因為所有 的值型別都是密封(seal)的;

g. 引用型別可以包含 null 值,值型別不能(可空型別功能允 許將 null 賦給值型別,如 int? a = null; );

h. 引用型別變數的賦值只複製對物件的引用,而不復制物件 本身。而將一個值型別變數賦給另一個值型別變數時,將 複製包含的值。

i. C#的引用型別包括: 
內建的 引用型別有:object、dynamic 和 string。 
物件(Object)型別 是 C# 通用型別系統(Common Type System - CTS)中所有資料型別的終極基類。 Object 是 System.Object 類的別名。所以物件 (Object)型別可以被分配任何其他型別(值型別、 引用型別、預定義型別或使用者自定義型別)的值。 但是,在分配值之前,需要先進行型別轉換。 
動態(Dynamic)型別您可以儲存任何型別的值在動 態資料型別變數中。這些變數的型別檢查是在執行 時發生的。動態型別與物件型別相似,但是物件類 型變數的型別檢查是在編譯時發生的,而動態型別 變數的型別檢查是在執行時發生的。 
字串(String)型別允許給變數分配任何字串 值。字串(String)型別是 System.String 類的 別名。它是從物件(Object)型別派生的。字串 (String)型別的值可以通過兩種形式進行分配: 引號和 @引號。 
使用者自定義引用型別有:class、陣列、interface 或 delegate。

型別的轉換

int.Parse():該方法只能將 string 型別數字字串強制 轉換為 int 型別 
ToString 把型別轉換為字串型別。

變數

1C# 中提供的基本的值型別大致可以分為以下幾類:
整數型別 sbyte、byte、short、ushort、int、uint、long、ulong 和 char
0是最小的正整數
-1是最大的負整數

有無符號:代表是否取得負數;
無符號:只有正整數
有符號:正負整數各取一半
Int:-2147483648~~~2147483647
浮點
型 float 和 double
十進位制型別 decimal
布林型別 true 或 false 值,指定的值
空型別 可為空值的資料型別
2. 變數的宣告
C#中變數定義的語法 <data_type> <variable_list>;
data_type:必須是一個有效的 C# 資料型別,可以是 char、 int、float、double 或其他使用者自定義的資料型別。 variable_list:可以由一個或多個用逗號分隔的識別符號名 稱組成。 
一些有效的變數定義如下所示
int i, j, k;
char c, ch;
float f, salary;
double d;
3. 變數的初始化
變數通過在等號後跟一個常量表達式進行初始化(賦值)。
a. 變數初始化是 C#強調安全性的另一種方式。簡單的說,C# 編譯器需要用某個初始值對變數進行初始化,之後才能在 操作中引用該變數。大多數現代編譯器把未初始化標記為 警告,但 C#編譯器把它當作錯誤來看待。這樣可以防止我 們無意中從其他程式遺留下來的你記憶體中獲取垃圾值。
b. C#確保變數在使用前初始化的兩個方法  變數直接定義在類中或者結構中,如果沒有顯示初始 化,那麼在建立變數的時候會有預設值  方法、事件內的變數必須在程式碼中顯示初始化,之後 才能在語句中使用它們的值。此時初始化不是宣告該 變數時進行的,但編譯器會通過方法檢查所有可能的路徑,如果檢測到區域性變數在初始化之前就使用了他 的值,直接報錯。

4. 變數的作用域 變數
的作用域是可以訪問該變數的程式碼區域。一般情況下, 確定作用域遵循以下規則: 
全域性變數:只要類在某個作用域內,其成員變數也在該作 用域內 
區域性變數:存在於表示宣告該變數的塊級語句或方法結束 的大括號之前的作用域內 
區域性變數:在 for、while 或類似語句中宣告的區域性變數存 在於該迴圈語句內

計算機儲存資料

整數在計算機中儲存是以補碼的方式儲存的,想要知道補 碼,必須先知道數字進位制轉換和原碼和反碼。
1.不同進位制的組成和輸出 
二進位制:以 0b 開頭,由 0 和 1 組成 
八進位制:以 0 開頭,由 0-7 組。(C#中沒有現成的表示方式) 
十進位制:預設就是十進位制,由 0-9 組成 
十六進位制:以 0x 開頭,由 0-9+A-F 組成
2. 進位制之間的轉換演算法  其他進位制轉十進位制 
口訣:將所有的位上面的值*進位制數的次方連起來既可 以得到十進位制 
位值:每一個位數上面對應的值 
進位制數:本身是多少進位制,進位制數就是多少 
次方:從右向左,從 0 開始編號,對應位上面的編號就 是改位的次方
反碼
正數的反碼和原碼一致,負數的反碼位數全部取反,除最 高位