1. 程式人生 > >c# 的變數型別

c# 的變數型別

值型別

         值型別變數直接儲存其資料值,注意包含整數型別,浮點型別以及布林型。值型別變數在棧中進行分配,因此效率很高,使用值型別的主要目的是為了提升效能。值型別具有如下特性。

  • 值型別變數都儲存在棧中。
  • 訪問值型別變數是,一般都是直接訪問其例項。
  • 每個值型別變數都有自己的資料副本,因此對一個值型別變數的操作不會影響其他變數。
  • 複製值型別變數時,複製的是變數的值,而不是變數的地址。
  • 值型別變數不能為null,必須具有一個確定的值。

值型別是從System.ValueType類繼承而來的型別。值型別中包含的幾種資料型別。

  • 整數型別  (int,long,byte,ushort,uint,ulong)u:有符號整形
  • 浮點型別    (float(單精度),double(雙精度)) 如果需要使用到float型別變數時,必須在數值的後面跟隨f或F,否則編譯器會直接將其作為double型別處理,也可以在double型別的值前加上(float),對其進行強制轉換.
  • 布林型        表示true 或 false .在定義全域性變數時,如果沒有特定的要求不用對其初始化,整數和浮點數型別的變數預設初始化為0,布林型別的初始化為false.

引用型別

     引用型別是構建C#程式應用的主要物件型別資料,在應用程式執行的過程中,預先定義的物件型別以new建立物件例項,並且儲存在堆中。堆是一種由系統彈性配置的記憶體空間,沒有特定大小及存活時間,因此可以被彈性的運用於物件的訪問。引用型別就類似於生活中的代理商,代理商沒有自己的產品,而是代理廠家的產品,使其就好像是自己的產品一樣。引用型別具有如下特徵。

  • 必須在託管堆中為引用型別變數分配記憶體
  • 使用new關鍵字來建立引用型別變數
  • 在託管堆中分配的每個物件都有與之相關聯的附加成員,這些成員必須被初始化。
  • 引用型別變數是由垃圾回收機制來管理的
  • 引用型別被賦值前的值都是NULL

多個引用型別變數可以引用同一物件,主要包括類,介面,陣列和委託。

值型別與引用型別的區別

從概念上來看,值型別就是儲存其值,而引用型別儲存對其值的引用。這兩種型別儲存在記憶體的不同地方。在C#中,必須設計型別時就決定型別例項的行為,如果在編寫程式碼時不能理解引用型別和值型別的區別。會給程式碼帶來不必要的異常

從記憶體空間來上來看,值型別是在棧中操作,而引用型別則是在堆中分配儲存單元。棧在編譯時就分好記憶體空間,在程式碼中有錢的明確定義,而堆是程式執行中動態分配的記憶體空間,可以根據程式的執行情況動態的分配記憶體的大小。因此,值型別總是在記憶體中佔用一個預定義的位元組數。而引用型別的變數則在堆中分配一個記憶體空間,這個記憶體空間包含的是對另一個記憶體位置的引用,這個位置是託管堆中的一個地址,即存放變數實際的地方。

也就是說值型別相當於現金,可以直接使用。而引用型別是存摺,需要先取銀行取錢才能用。

列舉型別

     列舉型別是一種特殊的值型別,它用於宣告一組具有相同性質的常量,編寫與日期有關的應用程式時,經常需要使用年,月,日,星期等資料時,可以將這些資料組織成多個不同名稱的列舉型別。使用列舉型別可以增加程式的可讀性和可維護性。同時,列舉型別可以避免型別錯誤。(在定義列舉型別時,如果不對其賦值,預設情況下,第一個列舉數的值為0,後面每個列舉數的值依次增加1.)列舉數的型別為整數型別.