一週學會C#(類一)
C#才鳥(QQ:249178521)
1.類的聲明<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
· 類是用戶自定義的引用類型
class Pair
{
public int X, Y; //公有變量名單詞的首字母大寫(PascalCase規則)
}
class Pair
{
private int x, y; //非公有變量名第一個單詞的首字母小寫(camelCase規則)
}
class Pair
{
int x, y; //缺省的訪問修飾符是private
};//可以有結尾分號
你可以使用關鍵字class來聲明類這一用戶自定義的引用類型。類的語法和結構的非常類似。它提供函數、字段、構造函數、操作符和訪問控制。類成員的缺省訪問權限是private。當你定義類的成員名時,不要忘了對公有成員使用PascalCase規則,而對非公有成員使用camelCase規則。
類的聲明中雖然可以使用結尾分號,但建議你不要使用,這只不過是爲了照顧C++程序員的習慣。
2.對象的產生
· 一個類的局部變量存在於棧(stack)中
w 不是被預先賦值的
w 可以被初始化爲null或調用構造函數進行初始化
(下面的例子中Pair類的聲明請看前面,右邊顯示的是內存中的情況,@表示指向)
棧 堆
static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()
{
Pair p; p ?
}
static void Main()
{
Pair p = null; p null
}
static void Main()
{
Pair p = new Pair(); p @ 0 .X
} 0 .Y
雖然類的聲明和結構的聲明非常類似,但類與結構是兩個不同的類型。結構是值類型,而類是引用類型。無論類的實例多大,類的局部變量只是這個類實例的一個引用。
上面例子中的最上面的那段程序定義了一個Pair類的局部變量p。不管Pair類包含什麼成員,p只是存在存在於棧中的一個引用。因爲p沒有被初始化,所以這個引用沒有被賦值,p也就不能被使用。
上面例子中的中間的那段程序定義了一個Pair類的局部變量p。p被初始化爲null,所以p沒有指向任何對象。p已經被賦值,所以p也就能被使用。
上面例子中的最下面的那段程序定義了一個Pair類的局部變量p。由new新生成一Pair類對象,這個新產生的對象產生在堆(heap)中,然後p通過賦值指向這一堆中的對象,而p是被定義爲存在於棧中。p已經被賦值,所以p也就能被使用。
new對於類來說是產生一堆中的對象,而對於結構來說是在棧中產生一個值,這可能需要一段時間的適應。
3.對象的構造函數
· 類的構造函數!=結構的構造函數
w 編譯器聲明缺省構造函數
w 你可以聲明缺省構造函數
w 如果你聲明構造函數,那麼編譯器不會聲明構造函數
class Pair
{
}
//編譯器聲明一缺省構造函數
class Pair
{
public Pair()
{ ... }
}
//正確,可以自己聲明缺省構造函數
class Pair
{
public Pair(int x, int y)
{ ... }
}
//正確,但編譯器聲明的缺省構造函數不存在,不存在缺省構造函數
類的缺省構造函數的規則與結構的缺省構造函數的規則是不同的。你可以回憶一下,結構總有一編譯器聲明的公有的缺省構造函數。不管你有沒有聲明構造函數,編譯器聲明的公有的缺省構造函數總是存在的。所以你不能定義缺省構造函數,這樣會出現兩個缺省構造函數,這是不允許的。
但這隻適合於結構,對於類是不適用的。如果你沒有聲明任何構造函數,那編譯器會產生缺省構造函數。但如果你定義了一個構造函數,那麼編譯器就不會產生缺省構造函數。這也意味着如果你聲明瞭一個或多個構造函數,那麼你能擁有缺省構造函數的唯一途徑是你聲明的構造函數中必須有一個是缺省構造函數。這樣的結果是如果你只定義了一非缺省構造函數,而你又要使用缺省構造函數的話,那你只有重載這個構造函數。如果你必須手動初始化類中的每一個字段(就像在結構中一樣),那將是非常麻煩的。但幸運的是你可以不必這麼做,你將在下面看到這一點。
4.:this(…)
· 一個構造函數可以調用另一構造函數
sealed class Pair
{
public Pair(int x, int y)
: this(x, y, Colour.Red)
{
}
public Pair(int x, int y, Colour c)
{
...
}
...
private int x, y;
private Colour c;
}