一、預定義類型。
1、值類型和引用類型
C#中的數據類型,可以分為值類型和引用類型,值類型存儲在堆棧上,而引用類型存儲在托管堆上。
如下代碼示例,
int i=10;
int j=i;
i和j的值都是10,並且在內存中會有兩個地方存儲10.
再看下面的代碼
Vector x=new Vector();
x.Value=20;
Vector y=x;
Console.WriteLine(y.Value);
y.Value=50;
Console.WriteLine(x.Value);
Vector是一個引用類型,引用類型在使用的時候需要new 來實例化一個。這段代碼執行後,只有一個 Vector對象,x,y都指向包含該對象的內存地址。因為x,y存儲的都是對象的引用,所以當y改變的時候, x也會改變。所以該程序輸出的結果是20和50.
如果變量是一個引用,就可以把其值設置為null,表示不指向任何對象。
2、CTS類型。
C#的預定義類型並沒有內置於語言中,而是內置於.NET Framework中,比如聲明一個int類型時,實際 上是.NET結構System.Int32的一個實例。這說明,可以把所有的基本數據類型看作是支持某些方法的類。
3、預定義的值類型
A、整型
sbyte ,8位有符號的整數,范圍從 -128到127.
byte ,8位無符號的整數,范圍從 0到255.
short,16位有符號的整數,范圍從 -32768到32767
ushort ,16位無符號的整數,范圍從0到65535
int,32位有符號的整數,范圍從-2147483648到2147483647
uint,32位無符號的整數,范圍從0到4294967295
long,64位有符號的整數,范圍從-2的31次方到2的31次方減1
ulong,64位無符號的整數,范圍從0到2的64次方減1
B、浮點類型。
float ,32位單精度浮點數。
double,64位雙精度浮點數。
如果代碼對某個非整數值,如12.3硬編碼,則編譯器一般假定該變量是double,如果想指定其為float ,則可以在後面加上字符f。
C、decimal類型。
該類型是一種財務專用數據類型,是128位高精度十進制表示法。
要把數據指定為decimal類型的,只需在數字後面加上M(或者m)
A、 bool類型。
C#的bool類型包含true和false。
B、 字符類型。
也就是char類型,表示一個16位的unicode字符。
char類型的字面量是采用 單引號 括起來的。而不是雙引號。雙引號括起來的是字符串類型的。
4、預定義引用類型。
A、object類型。
這是C#的基類,所有的類都派生自它。所以,可以使用object引用綁定任何子類型的對象,object類 型執行許多基本的一般用途的方法,如 Equals() GetHashCode(),GetType()等,我們需要針對某些方法 進行“重寫”,這在後面我們將會學習到。
B、string類型。
注意,string類型是屬於引用類型。我們來看下面一段代碼,在修改一個字符串的時候,實際上是創 建了一個新的字符串,而並非修改了原來在字符串。我們來看一個示例:
using System;
using System.Windows;
namespace gosoa.com
{
class MyFirstClass
{
static void Main()
{
string str1="GoSoA.com.cn";
string str2=str1;
Console.WriteLine("str1="+str1);
Console.WriteLine("str2="+str2);
str1="www.GoSoA.com.cn";
Console.WriteLine("str1="+str1);
Console.WriteLine("str2="+str2);
}
}
}
在這個示例中會輸出
str1="GoSoA.com.cn";
str2="GoSoA.com.cn";
str1="www.GoSoA.com.cn";
str2="GoSoA.com.cn";
這和我們所預期的引用類型正好相反,為什麼呢?
因為當我們用“GoSoA.com.cn”來初始化str1的時候,就在堆上分配了一個
string對象,當初始化str2的時候,也指向了這個對象。當str1改變的時候,並不是修改了原有的對 象,而是新創建了一個對象,但str2還是指向原來的對象,所以,str2的值並未改變。