.Net邊學(xué)邊講(二)
發(fā)表時(shí)間:2024-06-15 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]我們繼續(xù)來(lái)談一談?lì)惻c其他面向?qū)ο蟮木幊陶Z(yǔ)言不同,.Net中類有四個(gè)基本成員,data members(fields), function members(methods), properties, events。其他編程語(yǔ)言只有前兩項(xiàng)。這里需注意,data members(fields)永遠(yuǎn)不要聲...
我們繼續(xù)來(lái)談一談?lì)?br>與其他面向?qū)ο蟮木幊陶Z(yǔ)言不同,.Net中類有四個(gè)基本成員,data members(fields), function members(methods), properties, events。其他編程語(yǔ)言只有前兩項(xiàng)。這里需注意,data members(fields)永遠(yuǎn)不要聲明成public,因?yàn)檫@樣會(huì)使使用者無(wú)需知道你的類就可以改變你的數(shù)據(jù)。
public class test{
private int i;
}
這里i 就是一個(gè)data members(fields),需要提及一點(diǎn),properties提供了方便、安全的數(shù)據(jù)訪問(wèn)封裝。下面來(lái)談?wù)刦unction members(methods),他有兩種存在方式,instance和static。Instance隱含的接受了指向他所在的對(duì)象的指針,在C#中你可以用對(duì)象名或this得到。如:SomeObject.Method(), 或this.Method()。靜態(tài)的(Static)Method不能接收到this指針。因此他們不能直接訪問(wèn)類里的任何實(shí)例化數(shù)據(jù)。他的調(diào)用方式是SomeClassName.StaticMethod()。他無(wú)需例示。function members(methods)默認(rèn)是private的,即只能在聲明他們的類中訪問(wèn),我們需要聲明他們?yōu)閜ublic以便可以在任何類中訪問(wèn)。function members(methods)可以被重載,也就是說(shuō)你可以創(chuàng)建多個(gè)就有相同名字的方法,比如說(shuō)test(int i), test(double i), test(), test(string i, bool b).....。.Net編譯器會(huì)依據(jù)你傳遞的參數(shù)決定你在調(diào)用哪個(gè)方法。當(dāng)然還有一些其它的修飾符如extern,他的用途是如果你想在.Net Framework中聲明你的方法而在.Net Framework之外實(shí)現(xiàn)你的方法,比如說(shuō)在C# 中聲明你的方法而在windows本地dll中實(shí)現(xiàn)你的方法,你就要在C#中這樣聲明,public extern yourmethod(){}
接下來(lái)我們要談?wù)凜onstructors和Finalize,每個(gè)類都至少有一個(gè)Constructor的方法,如果你沒(méi)有提供,C#將自動(dòng)為你生成一個(gè)沒(méi)有任何參數(shù)的Constructor。Constructor是一個(gè)與你的類的名字相同且沒(méi)有任何返回值的的方法。每個(gè)Constructor都會(huì)調(diào)用一個(gè)你基類的Constructor(如果沒(méi)有顯性的基類,就調(diào)用對(duì)象的),這個(gè)調(diào)用會(huì)在你的Constructor主體執(zhí)行之前調(diào)用,這樣,你就知道你的基類有沒(méi)有正確的初始化了。Constructor只在每個(gè)對(duì)象被創(chuàng)建時(shí)調(diào)用一次,它的作用是初始化對(duì)象的實(shí)例,以便于調(diào)用。Destructors已不再需要,因?yàn)镃#會(huì)自動(dòng)提供一個(gè)清理對(duì)象的方法(叫Finalize)。垃圾自動(dòng)清理,這也是C#的區(qū)別于其他編程語(yǔ)言的特性之一。接下來(lái),我們?cè)撜務(wù)剬傩粤。首先為什么要用屬性??lái)看一個(gè)例子,如果你有一個(gè)類Person,有一個(gè)data members(fields)叫Age 是Int32型的被聲明成public,(前面我們講過(guò)不能聲明成public,這里就是舉例說(shuō)明為什么不能):
Person Jim = new Person(); // create object; pointed to by Jim
Jim.Age = 23;
Int32 JimsAge = Jim.Age;
Jim.Age = -5; // invalid, but unchecked if you use a field
這段代碼會(huì)造成兩個(gè)問(wèn)題
1.你的用戶知道了內(nèi)部數(shù)據(jù)的細(xì)節(jié),他們可能會(huì)做一些你不希望發(fā)生的操作
2.你的用戶可能會(huì)更改數(shù)據(jù)為一個(gè)不合法的值,如將Age設(shè)為零或負(fù)數(shù)
現(xiàn)在大家可以知道屬性的優(yōu)勢(shì)了,相對(duì)應(yīng)予上面提的
1.用戶不會(huì)知道你的內(nèi)部數(shù)據(jù)結(jié)構(gòu)
2.屬性方法會(huì)保護(hù)數(shù)據(jù)
下面的例程顯示了屬性的優(yōu)越。
public class Person
{
Int32 age; // 注意默認(rèn)是private
public Person(Int32 age) { // constructor
this.age = age; // this消除歧義!
}
public Int32 Age { // property
get {
return age;
}
set { // validating value
if (value > 0 && value < 150) {
age = value;
}
else { // throw exception if invalid value
throw new ArgumentException("Age must be between 1
and 150");
}
}
}
}
這段程序有幾個(gè)值的關(guān)注的地方
1.在constructor中,我們定義了一個(gè)參數(shù)也叫age,這會(huì)與private age產(chǎn)生歧義。我們用this來(lái)消除歧義。
2.get方法用于讀取屬性set方法用于存取屬性 。關(guān)鍵字value代表屬性被設(shè)置的值
3.在set方法中我們檢查了value的值,并在數(shù)據(jù)不合法時(shí)拋出了異常
有點(diǎn)打累了。。。:)
下次我們談?wù)別vent