從概念上講,值類型是直接存儲其值,而引用類型存儲對其值的引用。這兩種類型存儲在內存的不一樣地方。在C#中,必須在設計類型時就決定類型實例的行爲。若是在編寫代碼時,不能理解引用類型和值類型的區別,那麼將會給代碼帶來沒必要要的異常。ide
從內存空間上看,值類型是在棧中操做,而引用類型則在堆中分配存儲單元。棧在編譯時就分配好內存空間,在代碼中有棧的明肯定義,而堆是程序運行中動態分配的內存空間,能夠根據程序的運行狀況動態的分配內存的大小。所以,值類型老是在內存中佔用一個預約義的字節數。而引用類型的變量則在堆中分配一個內存空間,這個內存空間包含的是對另外一個內存位置的引用,這個位置是託管堆中的一個地址,即存放變量實際值的地方。spa
也就是說值類型至關於現金,要用就直接用,而引用類型至關於存摺,要用得先去銀行取。設計
C#的全部值類型均隱式派生自System.ValueType,而System.ValueType直接派生自System.Object。即System.ValueType自己是一個類類型,而不是值類型,其關鍵在於ValueType重寫了Equals()方法,從而對值類型按照實例的值來比較,而不是引用地址來比較。對象
枚舉類型是一種獨特的值類型,它用於聲明一組具備相同性質的常量。使用枚舉能夠增長程序的可讀性和可維護性。同時,枚舉類型能夠避免類型錯誤。內存
本質上,枚舉就是定義一個類,該類裏面的屬性都是靜態的弱數據類型的常量。string
在定義枚舉類型時,若是不對其進行賦值,默認狀況下,第一個枚舉數的值爲0,後面每一個枚舉數的值依次遞增1。it
在C#中使用關鍵字enum類聲明枚舉,其形式以下:編譯
enum 枚舉名class
{變量
list1=value1,
list2=value2,
list3=value3,
...
listN=valueN,
}
以下代碼:
class Program
{
enum MyDate
{
Sun=0,
Mon=1,
Tue=2,
Wed=3,
Thi=4,
Fri=5,
Sat=6,
}
public static void Main(string[] args)
{
int k=(int)DateTime.Now.DayOfWeek;
switch(k)
{
case (int)MyDate.Sun:Console.WriteLine("星期天");break;
}
}
}
類型轉換:
類型轉換就是將一種類型轉換成另外一種類型,轉換能夠是隱式轉換,也能夠是顯示轉換。對於類型轉換,能夠這麼想象,大腦前面是一片內存,源和目標分別是兩個大小不一樣的內存塊(由變量及數據的類型來決定),將源數據賦值給目標內存的過程,就是用目標內存塊取套取源內存中的數據,能套多少算多少。
隱式轉換:就是不須要聲明就能進行的轉換。當一種類型的值轉換爲大小相等或更大的另外一個類型時,則發生擴大轉換,當一種類型值轉換爲較小的另外一類型時,則發生收縮轉換。
顯式轉換:
顯式轉換也能夠稱爲強制轉換,須要在代碼中明確地聲明要轉換的類型。若是要把高精度的變量的值賦值給低精度的變量,就須要使用顯式轉換。
例如:建立一個控制檯應用程序,將double類型的x轉換爲int類型。
public static void Main(string[] args)
{
double x=1234566.789958546;
int y=(int)x;
Console.WriteLine(y);
Console.ReadLine();
}
顯式類型轉換也能夠經過Convert關鍵字進行顯示類型轉換。
好比:建立一個控制檯應用程序,經過Convert進行顯示類型轉換。
public static void Main(string[] args)
{
double a=123;
int b=Convert.ToInt32(a);
Console.WriteLine(b);
Console.ReadLine();
}
裝箱和拆箱:
將值類型轉換爲引用類型的過程叫作裝箱。相反,將引用類型轉換爲值類型的過程叫作拆箱。
裝箱容許將值類型隱式轉換爲引用類型。好比:
int a=1;
object b=i;
//這裏的b就是引用類型。
拆箱容許將引用類型顯示轉換爲值類型。
裝箱是將一個值類型轉換爲一個對象類型,而拆箱是將一個對象類型顯示轉換爲一個值類型。對於裝箱而言,他是將被裝箱的值類型複製爲一個副原本轉換,而對於拆箱而言,須要注意類型的兼容性。例如:不能將一個值爲:string的object類型轉換爲int類型。
常量就是其值固定不變的量。並且常量的值在編譯時就已經肯定了。C#中使用const定義常量,而且在建立常量是必須設置它的初始值。常量就至關於每一個公民的×××號,一旦設置就不容許修改。