上一講中我們大概了解了類這個概念,這一講我們來進一步的學習一下這個概念。c#是一個面向對象的語言,類就是對現實世界某個事物的抽象,比如“人”他在程式中就可以用一個類來表示,人有年齡(Age),有姓名(Name),人還可以吃飯(Eat)和睡覺(Sleep),根據這幾點我們就可以建立一個類來表示人。如下(先大概看一下,不懂沒關系,看完這一講就懂了):
class People
{
public int Age{get;set;}
public string Name { get; set; }
public void Eat() {
Console.WriteLine("我正在吃飯。。。");
}
public void Sleep()
{
Console.WriteLine("我正在睡覺。。。");
}
}
一、建立一個類
我上面已經建立了一個類,現在我們來一起看看。建立一個類我總結有兩個步驟:模組化和精簡。我們上面建立“人”的類是這樣分析的,人有名字有年齡,會吃飯會睡覺,這就是模組化的過程,那怎麼精簡呢?人不僅僅有名字有年齡,還有性别、身高等,也不僅僅隻會吃飯、睡覺,還會學習工作,但是我們程式中不需要這些屬性,也不需要他會學習工作,是以我們隻建立我們需要的屬性和操作,這個過程就是精簡。
二、對象
對象也叫執行個體,是類經過“執行個體化”得到的在記憶體中的實體,這個記憶體實體對應現實世界中的一個實體。我們上面建立的類就好比是中文的“人類”這個概念,他指的不是某一個人,而對象則是值得是某一個特定的人,比如張三。執行個體(張三,25歲,會吃飯睡覺)他是人類(定義的類)的一個對象。但是有些類不能執行個體化,比如“數學”這個類,你不能說一個數學,往後我們會遇到。
三、類的成員
屬性、方法和事件是類的主要成員,學習了這幾個概念,大家就會自己建立類了。在我們實際開發中有一些類的成員是有側重的,像數學這個類,裡面更多的是一些實作數學計算的方法,還有一種模型類,它裡面以屬性為主,每一個屬性對應資料表中的一個字段。
1、屬性(Property)
屬性的作用是用來存儲和讀寫資料的,這些資料組合起來就可以表示對象目前的狀态,比如上面提到的姓名和年齡;
看一下如何寫一個屬性(注意注釋部分内容):
class People
{
//“屬性是這樣的成員:它提供靈活的機制來讀取、編寫或計算某個私有字段的值。
//可以像使用公共資料成員一樣使用屬性,但實際上它們是稱作“通路器”的特殊方法。
//這使得可以輕松通路資料,此外還有助于提高方法的安全性和靈活性。”
//這是一個字段,
private int age;
//這一塊才是屬性
public int Age
{
get
{
return age;
}
set
{
this.age = value;
}
}
// 。。。
}
有的同學可能已經懵掉了,怎麼又跑出來一個字段了。其實嚴格來說屬性是不儲存資料的,資料是存在字段裡面的,而屬性是用來讀(get)和寫(get)字段。至于為什麼要搞這麼一出?是為了資料安全考慮,字段往往是不對外可見的,是以一般隻能通過屬性的get/set方法來讀取。這樣我們可以做的就多了:比如我們在set方法中做如下修改:
class People
{
//“屬性是這樣的成員:它提供靈活的機制來讀取、編寫或計算某個私有字段的值。
//可以像使用公共資料成員一樣使用屬性,但實際上它們是稱作“通路器”的特殊方法。
//這使得可以輕松通路資料,此外還有助于提高方法的安全性和靈活性。”
//這是一個字段,
private int age;
//這一塊才是屬性
public int Age
{
get
{
return age;
}
set
{
//年齡在125以下,不可以是負的。
if(value < 125 && value > 0){
this.age = value;
}else{
this.age = 0;
}
}
}
// 。。。
}
你看這樣我們就對寫入的年齡做了限制,以免出現1000歲這樣的笑話,而且這種笑話程式是不會知道的。我們也可以直接不寫get方法表示字段是隻寫的,不寫set方法,表示字段是隻讀的。可能有人覺得這麼定義一個屬性好麻煩,别急有簡寫方法,就像本文第一段代碼那樣:public int Age{get;set;}
總結一下:
屬性對外暴露字段資料,并可以修改字段的值;對内保護字段不受“非法值”污染,如年齡:1000
一般情況下,它們都用于表示實體(對象或類型)的狀态
屬性大多數情況下是字段的包裝器(wrapper)
建議:不要用字段來直接暴露資料,請用屬性。
2、方法(Method)
方法表示對象能做什麼,是非常重要的成員。我們以後希望程式做的事情絕大部分都在方法裡面,日後我們絕大部分時間都在編寫方法。看一下菜鳥教程中寫的:
當定義一個方法時,從根本上說是在聲明它的結構的元素。在 C# 中,定義方法的文法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
下面是方法的各個元素:
- Access Specifier:通路修飾符,這個決定了變量或方法對于另一個類的可見性。
- Return type:傳回類型,一個方法可以傳回一個值。傳回類型是方法傳回的值的資料類型。如果方法不傳回任何值,則傳回類型為 void。
- Method name:方法名稱,是一個唯一的辨別符,且是大小寫敏感的。它不能與類中聲明的其他辨別符相同。
- Parameter list:參數清單,使用圓括号括起來,該參數是用來傳遞和接收方法的資料。參數清單是指方法的參數類型、順序和數量。參數是可選的,也就是說,一個方法可能不包含參數。
- Method body:方法主體,包含了完成任務所需的指令集。
其中通路修飾符面試中基本都會涉及到,大家可以百度學習一下,這個是用來标記成員的權限。他的後面還可以插入static來标記是否是靜态成員(參考本文第四點)。看一個簡單的方法,給出兩個數字,傳回最大的一個:
//通路修飾符:public,表示是公開的,都可以調用。如果不寫預設是:private(記不清是不是了)
//傳回值:整型;不需要傳回值的話用void表示。
//方法名:GetMax
//參數清單:整型x,整型y
public int GetMax(int x, int y) {
//比較大小
if (x >= y)
{
//傳回最大的額
return x;
}
else {
return y;
}
}
3、事件(Event)
類或對象通知其他類或對象的執行個體。他是C#所特有的。
四、靜态成員和執行個體(非靜态)成員
靜态成員表示的是這個類自有的成員,不屬于任何一個執行個體所有。這樣講可能比較晦澀,看一個例子:還拿剛剛“人”這個例子來說,我可以給他一個靜态屬性:“人口總數”,人口總數是對人這個大的概念而言的,而對一個單獨的人來說是沒有意義的。
通過static這個關鍵字可以定義一個靜态成員如:
class People
{
//用static關鍵字來申明一個成員是靜态成員
//靜态成員--屬性
//人口總數
public static int Total { get; set; }
//靜态成員--方法
//計劃生育
public static void Jihuashengyu() {
//控制人口增長
}
public int Age { get; set; }
public string Name { get; set; }
//。。。
}
五、使用
看如下代碼和注釋内容:
//非靜态(執行個體)成員的調用
//執行個體成員是執行個體的成員,要使用我們要先建立類的執行個體,然後通過這個執行個體來調用對應的成員
//用new關鍵字建立執行個體,并用對應的變量接受,這個變量代表了這個執行個體
People p = new People();
//執行個體通過‘.’這個符号來通路對應的成員,這個點符号稱為:成員通路符。
p.Age = 25;
p.Name = "maaici";
Console.WriteLine("姓名是:" + p.Name + " 年齡:" + p.Age);
Console.WriteLine("++++++++++++++++++++++++我是分隔符++++++++++++++++++++");
//靜态成員的調用
//靜态成員是類自身的成員,是以直接就可以用類名進行通路。
People.Total = 7566722219;
Console.WriteLine("全世界人口總數大約:" + People.Total);
Console.ReadKey();
和老闆打遊擊,比較倉促,如有不妥的地方甚至錯誤的希望告知。
下一講:C#第4講:輕松應對C#的幾種參數類型