# C# 類(Class)
當您定義一個類時,您定義了一個數據類型的藍圖。這實際上并沒有定義任何的數據,但它定義了類的名稱意味著什么,也就是說,類的對象由什么組成及在這個對象上可執行什么操作。對象是類的實例。構成類的方法和變量成為類的成員。
## 類的定義
類的定義是以關鍵字 **class** 開始,后跟類的名稱。類的主體,包含在一對花括號內。下面是類定義的一般形式:
```
<access specifier> class class_name
{
// member variables
<access specifier> <data type> variable1;
<access specifier> <data type> variable2;
...
<access specifier> <data type> variableN;
// member methods
<access specifier> <return type> method1(parameter_list)
{
// method body
}
<access specifier> <return type> method2(parameter_list)
{
// method body
}
...
<access specifier> <return type> methodN(parameter_list)
{
// method body
}
}
```
請注意:
* 訪問標識符 <access specifier> 指定了對類及其成員的訪問規則。如果沒有指定,則使用默認的訪問標識符。類的默認訪問標識符是 **internal**,成員的默認訪問標識符是 **private**。
* 數據類型 <data type> 指定了變量的類型,返回類型 <return type> 指定了返回的方法返回的數據類型。
* 如果要訪問類的成員,您要使用點(.)運算符。
* 點運算符鏈接了對象的名稱和成員的名稱。
下面的實例說明了目前為止所討論的概念:
```
using System;
namespace BoxApplication
{
class Box
{
public double length; // 長度
public double breadth; // 寬度
public double height; // 高度
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 聲明 Box1,類型為 Box
Box Box2 = new Box(); // 聲明 Box2,類型為 Box
double volume = 0.0; // 體積
// Box1 詳述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// Box2 詳述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// Box1 的體積
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Box1 的體積: {0}", volume);
// Box2 的體積
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Box2 的體積: {0}", volume);
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
Box1 的體積: 210
Box2 的體積: 1560
```
## 成員函數和封裝
類的成員函數是一個在類定義中有它的定義或原型的函數,就像其他變量一樣。作為類的一個成為,它能在類的任何對象上操作,且能訪問該對象的類的所有成員。
成員變量是對象的屬性(從設計角度),且它們保持私有來實現封裝。這些變量只能使用公共成員函數來訪問。
讓我們使用上面的概念來設置和獲取一個類中不同的類成員的值:
```
using System;
namespace BoxApplication
{
class Box
{
private double length; // 長度
private double breadth; // 寬度
private double height; // 高度
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(); // 聲明 Box2,類型為 Box
double volume; // 體積
// Box1 詳述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 詳述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1 的體積
volume = Box1.getVolume();
Console.WriteLine("Box1 的體積: {0}" ,volume);
// Box2 的體積
volume = Box2.getVolume();
Console.WriteLine("Box2 的體積: {0}", volume);
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
Box1 的體積: 210
Box2 的體積: 1560
```
## C# 中的構造函數
類的 **構造函數** 是類的一個特殊的成員函數,當創建類的新對象時執行。
構造函數的名稱與類的名稱完全相同,它沒有任何返回類型。
下面的實例說明了構造函數的概念:
```
using System;
namespace LineApplication
{
class Line
{
private double length; // 線條的長度
public Line()
{
Console.WriteLine("對象已創建");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 設置線條長度
line.setLength(6.0);
Console.WriteLine("線條的長度: {0}", line.getLength());
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
對象已創建
線條的長度: 6
```
**默認的構造函數**沒有任何參數。但是如果您需要一個帶有參數的構造函數可以有參數,這種構造函數叫做**參數化構造函數**。這種技術可以幫助您在創建對象的同時給對象賦初始值,具體請看下面實例:
```
using System;
namespace LineApplication
{
class Line
{
private double length; // 線條的長度
public Line(double len) // 參數化構造函數
{
Console.WriteLine("對象已創建,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("線條的長度: {0}", line.getLength());
// 設置線條長度
line.setLength(6.0);
Console.WriteLine("線條的長度: {0}", line.getLength());
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
對象已創建,length = 10
線條的長度: 10
線條的長度: 6
```
## C# 中的析構函數
類的 **析構函數** 是類的一個特殊的成員函數,當類的對象超出范圍時執行。
析構函數的名稱是在類的名稱前加上一個波浪形(~)作為前綴,它不返回值,也不帶任何參數。
析構函數用于在結束程序(比如關閉文件、釋放內存等)之前釋放資源。析構函數不能繼承或重載。
下面的實例說明了析構函數的概念:
```
using System;
namespace LineApplication
{
class Line
{
private double length; // 線條的長度
public Line() // 構造函數
{
Console.WriteLine("對象已創建");
}
~Line() //析構函數
{
Console.WriteLine("對象已刪除");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 設置線條長度
line.setLength(6.0);
Console.WriteLine("線條的長度: {0}", line.getLength());
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
對象已創建
線條的長度: 6
對象已刪除
```
## C# 類的靜態成員
我們可以使用 **static** 關鍵字把類成員定義為靜態的。當我們聲明一個類成員為靜態時,意味著無論有多少個類的對象被創建,只會有一個該靜態成員的副本。
關鍵字 **static** 意味著類中只有一個該成員的實例。靜態變量用于定義常量,因為它們的值可以通過直接調用類而不需要創建類的實例來獲取。靜態變量可在成員函數或類的定義外部進行初始化。您也可以在類的定義內部初始化靜態變量。
下面的實例演示了**靜態變量**的用法:
```
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("s1 的變量 num: {0}", s1.getNum());
Console.WriteLine("s2 的變量 num: {0}", s2.getNum());
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
s1 的變量 num: 6
s2 的變量 num: 6
```
您也可以把一個**成員函數**聲明為 **static**。這樣的函數只能訪問靜態變量。靜態函數在對象被創建之前就已經存在。下面的實例演示了**靜態函數**的用法:
```
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("變量 num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
```
變量 num: 3
```
- C# 基礎
- C# 簡介
- C# 環境
- C# 程序結構
- C# 基本語法
- C# 數據類型
- C# 類型轉換
- C# 變量
- C# 常量
- C# 運算符
- C# 判斷
- C# 循環
- C# 封裝
- C# 方法
- C# 可空類型(Nullable)
- C# 數組(Array)
- C# 字符串(String)
- C# 結構(Struct)
- C# 枚舉(Enum)
- C# 類(Class)
- C# 繼承
- C# 多態性
- C# 運算符重載
- C# 接口(Interface)
- C# 命名空間(Namespace)
- C# 預處理器指令
- C# 正則表達式
- C# 異常處理
- C# 文件的輸入與輸出
- C# 高級
- C# 特性(Attribute)
- C# 反射(Reflection)
- C# 屬性(Property)
- C# 索引器(Indexer)
- C# 委托(Delegate)
- C# 事件(Event)
- C# 集合(Collection)
- C# 泛型(Generic)
- C# 匿名方法
- C# 不安全代碼
- C# 多線程
- ASP.NET 簡介
- Web Pages 教程
- ASP.NET Web Pages - 教程
- ASP.NET Web Pages - 添加 Razor 代碼
- ASP.NET Web Pages - 頁面布局
- ASP.NET Web Pages - 文件夾
- ASP.NET Web Pages - 全局頁面
- ASP.NET Web Pages - HTML 表單
- ASP.NET Web Pages - 對象
- ASP.NET Web Pages - 文件
- ASP.NET Web Pages - 幫助器
- ASP.NET Web Pages - WebGrid 幫助器
- ASP.NET Web Pages - Chart 幫助器
- ASP.NET Web Pages - WebMail 幫助器
- ASP.NET Web Pages - PHP
- ASP.NET Web Pages - 發布網站
- Razor 教程
- ASP.NET Razor - 標記
- ASP.NET Razor - C# 和 VB 代碼語法
- ASP.NET Razor - C# 變量
- ASP.NET Razor - C# 循環和數組
- ASP.NET Razor - C# 邏輯條件
- ASP.NET Razor - VB 變量
- ASP.NET Razor - VB 循環和數組
- ASP.NET Razor - VB 邏輯條件
- MVC 教程
- ASP.NET MVC 教程
- ASP.NET MVC - Internet 應用程序
- ASP.NET MVC - 應用程序文件夾
- ASP.NET MVC - 樣式和布局
- ASP.NET MVC - 控制器
- ASP.NET MVC - 視圖
- ASP.NET MVC - SQL 數據庫
- ASP.NET MVC - 模型
- ASP.NET MVC - 安全
- ASP.NET MVC - HTML 幫助器
- ASP.NET MVC - 發布網站
- Web Forms 教程
- ASP.NET Web Forms - 教程
- ASP.NET Web Forms - HTML 頁面
- ASP.NET Web Forms - 服務器控件
- ASP.NET Web Forms - 事件
- ASP.NET Web Forms - HTML 表單
- ASP.NET Web Forms - 維持 ViewState
- ASP.NET Web Forms - TextBox 控件
- ASP.NET Web Forms - Button 控件
- ASP.NET Web Forms - 數據綁定
- ASP.NET Web Forms - ArrayList 對象
- ASP.NET Web Forms - Hashtable 對象
- ASP.NET Web Forms - SortedList 對象
- ASP.NET Web Forms - XML 文件
- ASP.NET Web Forms - Repeater 控件
- ASP.NET Web Forms - DataList 控件
- ASP.NET Web Forms - 數據庫連接
- ASP.NET Web Forms - 母版頁
- ASP.NET Web Forms - 導航
- Web Pages 參考手冊
- ASP.NET Web Pages - 類
- ASP.NET Web Pages - WebSecurity 對象
- ASP.NET Web Pages - Database 對象
- ASP.NET Web Pages - WebMail 對象
- ASP.NET Web Pages - 更多幫助器
- MVC - 參考手冊
- Web Forms 參考手冊
- ASP.NET Web Forms - HTML 服務器控件
- ASP.NET Web Forms - Web 服務器控件
- ASP.NET Web Forms - Validation 服務器控件
- 免責聲明