一、類的概述
類,是創建對象的模板,每個對象都包含數據,並且提供了處理和訪問數據的方法。換言之,類,定 義了每個對象,也就是“實例”包含什麼數據和功能。
比如我們定義一個“醫生”類,並且實例化一個。我們看下面的代碼:
using System;
namespace gosoa.com.cn
{
public class Doctor
{
public Doctor(){}
public Doctor(string name,byte age)
{
this._name=name;
this._age=age;
}
private string _name;
private byte _age;
public string Name
{
get{return this._name;}
set{this._name=value;}
}
public byte Age
{
get{return this._age;}
set{this._age=value; }
}
public string doSth()
{
return "我會給人治病喔~~";
}
public static string doAnth()
{
return "執行的另一個靜態方法";
}
}
public class OneDoctor
{
static void Main()
{
Doctor dc=new Doctor();
dc.Name="李四";
dc.Age=25;
Doctor dc2=new Doctor("張三",35);
Console.WriteLine(dc.Name);
Console.WriteLine(dc.Age);
Console.WriteLine(dc2.Name);
Console.WriteLine(dc2.Age);
Console.WriteLine(dc.doSth());
Console.WriteLine(Doctor.doAnth());
}
}
}
在這個例子中,public class Doctor 便是聲明了一個類。_name和_age是其兩個屬性。doSth()是其 的一個方法(即對象的行為)。 Doctor dc=new Doctor() 用來實例化了一個Doctor類,也就類似實例化 了一個對象,產生了一個新醫生。Doctor dc2=new Doctor("張三",35);是實例化的另外一個類,也就是 另外一個醫生。
在Doctor類中,public Doctor(){} public Doctor(string name,byte age) 這兩個方法叫做 構造 函數。是用來初始化類的,在每個類被實例化的時候,會自動調用。
public string Name
{
get{return this._name;}
set{this._name=value;}
}
這段代碼是用來設置和獲取類的屬性的。也就類似java中的 getName 和 setName 方法。只是在C#中 這變得更容易了。
注意一點:類是存儲在托管堆上的引用類型。
二、方法
1、 方法概述
方法和C語言中的 函數共享同一個理念。一直以來,我們在用的Main()方法就是個例子。還有上例中 public string doSth() 也是一個方法。其中,public是 類的修飾符,string是方法的返回值,也可以 沒有返回值,即 void ,doSth是方法名稱。()括號必須有,在括號中可以有參數,如Doctor類的構造函 數 public Doctor(string name,byte age) 就有兩個參數。方法體則必須用一對{}括起來。
方法的調用,則需要先實例化類,然後調用類的某個方法。上例中Doctor dc=new Doctor();來實例化 了類,然後 dc.doSth() 就是調用了Doctor類的方法。
如果方法是靜態的,即 static,則不需要實例化類,直接使用 類名.方法名 就可以調用了。如上例 中 Console.WriteLine(Doctor.doAnth()); 即是直接調用了靜態的doAnth方法。
2、方法的參數
參數可以通過引用或者值傳遞 給方法。具體有什麼區別呢?
我們來看個例子。
using System;
namespace gosoa.com.cn
{
public class OneDoctor
{
static void FunctionTest(int [] arr, int x)
{
arr[0]=100;
x=10;
}
static void Main()
{
int [] arrTemp={0,1,2,3,4};
int y=30;
Console.WriteLine(arrTemp[0]);
Console.WriteLine(y);
FunctionTest(arrTemp, y);
Console.WriteLine(arrTemp[0]);
Console.WriteLine(y);
}
}
}
本例的輸出結果是0,30,100,30 因為數組是引用類型,在調用方法前後,引用類型的修改會保留下 來,而值類型的修改不會保留下來。
3、ref 參數。
我們把 上例中的方法修改為 static void FunctionTest(int [] arr, ref int x) 這樣,調用的時 候 也加上 ref 即:functionTest(arrTemp, ref y); 執行後的結果就是0,30,100,10。
ref 關鍵字是強迫參數通過引用傳遞。
注意:在調用有ref參數的方法時,必須將參數要傳遞的參數提前初始化。但在調用out參數的方法時 ,就不必提前初始化。
4、out 參數
在上例中,我們稍作修改。
static void FunctionTest(out int x)
{
x=100;
}
static void Main()
{
int y;
FunctionTest(out y);
Console.WriteLine(y);
}
在Maim()函數中調用FunctionTest之前,y並沒有初始化。但其輸出結果確實100;因為這樣屬於引用 傳遞,值的修改會被保留下來。
5、方法的重載
所謂重載就是指 方法名相同,而參數不同(參數類型,參數個數)看下面一個例子
using System;
namespace gosoa.com.cn
{
public class test
{
static int FunctionTest(int x)
{
return x+100;
}
static string FunctionTest(string str)
{
return str;
}
static int FunctionTest(int x,int y)
{
return x+y;
}
static void Main()
{
Console.WriteLine(FunctionTest(10) );
Console.WriteLine(FunctionTest("gosoa.com.cn") );
Console.WriteLine(FunctionTest(5,20));
}
}
}
在這裡例子中,有三個方法functionTest 其參數都不一樣。在調用的時候,系統會根據傳遞的參數自 動選擇調用哪個方法的。這就是方法的重載。
在這裡注意,重載的條件是,必須參數類型不同,或者參數個數不同。