當(dāng)你定義一個(gè)類,你實(shí)際上定義的是一個(gè)數(shù)據(jù)類型的藍(lán)圖。實(shí)際上你并沒(méi)有定義任何數(shù)據(jù),但是它定義了類的名字意味著什么。也就是說(shuō),一個(gè)類的對(duì)象由一些可以在該類上進(jìn)行的操作構(gòu)成。對(duì)象是類的實(shí)例。構(gòu)成類的方法和變量被稱為類的成員。
一個(gè)類定義以關(guān)鍵字 class 開(kāi)始,其后跟的是類的名稱;類的主體部分體由一對(duì)花括號(hào)括起來(lái)。以下是一個(gè)類定義的一般形式:
class class_name
{
// 成員變量
variable1;
variable2;
...
variableN;
// 成員變量
method1(parameter_list)
{
// 方法主體
}
method2(parameter_list)
{
// 方法主體
}
...
methodN(parameter_list)
{
// 方法主體
}
}
筆記:
訪問(wèn)說(shuō)明符的訪問(wèn)成員的規(guī)則與類本身的訪問(wèn)規(guī)則相同。如果沒(méi)有說(shuō)明,則默認(rèn)訪問(wèn)的類的類型為 internal 。對(duì)成員的默認(rèn)訪問(wèn)類型是 private 。
數(shù)據(jù)類型指定了變量的類型,如果有返回值的話,返回指定方法的數(shù)據(jù)類型。
訪問(wèn)類的成員,可以使用 "." 點(diǎn)運(yùn)算符。
下面的例子說(shuō)明了到目前為止對(duì)于概念的討論:
using System;
namespace BoxApplication
{
class Box
{
public double length; // box 的長(zhǎng)度
public double breadth; // box 的寬度
public double height; // box 的高度
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 聲明 box1 為 box 類型
Box Box2 = new Box(); // 聲明 box2 為 box 類型
double volume = 0.0; // 在這里存放 box 的體積
// box 1 詳細(xì)數(shù)據(jù)
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 詳細(xì)數(shù)據(jù)
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的體積
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Volume of Box1 : {0}", volume);
// box 2 的體積
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Volume of Box2 : {0}", volume);
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Volume of Box1 : 210
Volume of Box2 : 1560
一個(gè)類的成員函數(shù)有其自己定義的或其原型寫在類體中。它可以操作該類的任何成員對(duì)象,并且可以訪問(wèn)一個(gè)類的所有成員。
成員變量是一個(gè)對(duì)象的屬性(從設(shè)計(jì)的角度來(lái)看),他們都是私有(private)的以便實(shí)施封裝。這些變量只能被 public 成員函數(shù)訪問(wèn)。
讓我們把上述那些概念來(lái) set 和 get 一個(gè)類中不同的類成員的值:
using System;
namespace BoxApplication
{
class Box
{
private double length; // box 的長(zhǎng)度
private double breadth; // box 的寬度
private double height; // box 的高度
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
public double getVolume()
{
return length * breadth * height;
}
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 將 Box1 聲明為 Box 類型
Box Box2 = new Box();
double volume;
// 將 Box2 聲明為 Box 類型
// box 1 詳細(xì)數(shù)據(jù)
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 詳細(xì)數(shù)據(jù)
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// box 1 的體積
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}" ,volume);
// box 2 的體積
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Volume of Box1 : 210
Volume of Box2 : 1560
一個(gè)類的構(gòu)造函數(shù)(constructor)是類的一種特殊的成員函數(shù),當(dāng)我們創(chuàng)建一個(gè)類的新的對(duì)象時(shí)執(zhí)行該函數(shù)。
構(gòu)造函數(shù)與類具有相同的名稱,但它沒(méi)有任何返回類型。下面的例子說(shuō)明了構(gòu)造函數(shù)的概念:
using System;
namespace LineApplication
{
class Line
{
private double length; // 線段長(zhǎng)度
public Line()
{
Console.WriteLine("Object is being created");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 設(shè)置線段長(zhǎng)度
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Object is being created
Length of line : 6
默認(rèn)構(gòu)造函數(shù)(default constructor)沒(méi)有任何的參數(shù),但是如果你需要,構(gòu)造函數(shù)是可以有參數(shù)的。這種構(gòu)造函數(shù)被稱為參數(shù)化的構(gòu)造函數(shù)(parameterized constructors)。這種技術(shù)有助于你在一個(gè)對(duì)象被創(chuàng)建時(shí)指定它的初始值,如下述示例:
using System;
namespace LineApplication
{
class Line
{
private double length; // 線段長(zhǎng)度
public Line(double len) //參數(shù)化構(gòu)造函數(shù)
{
Console.WriteLine("Object is being created, length = {0}", len);
length = len;
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line(10.0);
Console.WriteLine("Length of line : {0}", line.getLength());
// 設(shè)置線段長(zhǎng)度
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Object is being created, length = 10
Length of line : 10
Length of line : 6
析構(gòu)函數(shù)(destructor)是類的一種特殊的成員函數(shù),當(dāng)類的對(duì)象在超出作用域時(shí)被執(zhí)行的一種成員函數(shù)。一個(gè)析構(gòu)函數(shù)的名稱是在其類名稱前加上一個(gè)前綴字符(~),它既不能返回一個(gè)值,也不能帶有任何參數(shù)。
析構(gòu)函數(shù)對(duì)退出程序前釋放內(nèi)存資源時(shí)非常有用。析構(gòu)函數(shù)不可以被繼承或重載。
下面的示例解釋了析構(gòu)函數(shù)的概念:
using System;
namespace LineApplication
{
class Line
{
private double length; // 線段長(zhǎng)度
public Line() // 構(gòu)造函數(shù)
{
Console.WriteLine("Object is being created");
}
~Line() //析構(gòu)函數(shù)
{
Console.WriteLine("Object is being deleted");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 設(shè)置線段長(zhǎng)度
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Object is being created
Length of line : 6
Object is being deleted
我們可以使用 static 關(guān)鍵字將類成員定義為靜態(tài)的。當(dāng)我們聲明一個(gè)類的靜態(tài)成員時(shí),意味著無(wú)論有多少類的對(duì)象被創(chuàng)建,只有一個(gè)副本的靜態(tài)成員。
關(guān)鍵字 static 意味著一個(gè)類的成員只有一個(gè)實(shí)例存在。靜態(tài)變量被用于定義常數(shù),因?yàn)樗麄兊闹悼梢酝ㄟ^(guò)調(diào)用不創(chuàng)建實(shí)例的類而被檢索出來(lái)。靜態(tài)變量可以在成員函數(shù)或者類的定義以外的地方初始化。你也可以在類的定義中初始化靜態(tài)變量。
下面的示例論證了靜態(tài)變量(static variables)的使用:
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("Variable num for s1: {0}", s1.getNum());
Console.WriteLine("Variable num for s2: {0}", s2.getNum());
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Variable num for s1: 6
Variable num for s2: 6
你也可以聲明 static 的成員函數(shù)。此類函數(shù)只能訪問(wèn)靜態(tài)變量。靜態(tài)函數(shù)的存在甚至先于創(chuàng)建對(duì)象。下面的示例論證了靜態(tài)函數(shù)(static functions)的用法:
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public static int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
Console.WriteLine("Variable num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Variable num: 3
更多建議: