編寫程序只不過是對象堆砌而成的,這些對象可以是獨(dú)立的,也可以是從另外一個對下崗繼承過來,對
成都創(chuàng)新互聯(lián)長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昌江黎族企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),昌江黎族網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
象之間可以傳遞消息,并通過消息來改變自身的狀態(tài).
類是對象的模板.即類是對一組由相同數(shù)據(jù)和相同操作的對象的定義,一個類所包含的方法和數(shù)據(jù)描述
一組對象的共同屬性和行為.類是在對象之上的抽象,對象則是類的具體化. 類可以有其子類,也可有
其他類,形成類層次結(jié)構(gòu).
類是對具有相同屬性和行為的一組形似的對象的抽象.
面向?qū)ο蟮幕咎卣? 封裝,繼承,多態(tài)
Object是所有的類的基類.
定義類與創(chuàng)建類的對象
class Myclass{
//類的主題
}
★★★★類的修飾符
在定義類是,可以在類的前面添加訪問修飾符,類的修飾符用于控制被訪問的范圍.默認(rèn)情況下,類的修
飾符為private
new僅允許在嵌套類定義時使用,以表明類中隱藏了由基類中繼承而來的與基類中同名的成員
public類可以在任何地方訪問
protected只能從所在類和所在類的派生出來的子類進(jìn)行訪問,不能實(shí)例化,只能繼承.
★★★★創(chuàng)建類的對象
MyClass myclass = new MyClass();
結(jié)構(gòu)的定義:
結(jié)構(gòu)與類相似,主要區(qū)別在于:類是存儲在堆上的引用類型,而結(jié)構(gòu)式存儲在堆棧上的值類型,以及訪問
方式和一些特征(例如:結(jié)構(gòu)不支持繼承);
定義結(jié)構(gòu):
在語法上,定義結(jié)構(gòu)和定義類非常相似,主要區(qū)別是定義結(jié)構(gòu)使用struct關(guān)鍵字代替class關(guān)鍵字.對于
類和結(jié)構(gòu),都是用new關(guān)鍵字生聲明實(shí)例
struct FirstStruct{ //聲明結(jié)構(gòu)
//代碼
}
FirstStruct first = new FirstStruct(); //實(shí)例化結(jié)構(gòu)
類的數(shù)據(jù)成員:
構(gòu)造函數(shù),析構(gòu)函數(shù),常數(shù),字段,方法,屬性,索引器,運(yùn)算符,事件,委托,類,接口,結(jié)構(gòu).
方法:
public string FangFa(){
return "返回值";
}
public void FangFa(){
Message.Show("無返回值");
}
★★★★ref關(guān)鍵字
可以通過引用為方法傳遞參數(shù),不過若通過引用為方法傳遞參數(shù),需要使用ref關(guān)鍵字.
string sex ="www";
Person p = new Person();
string name = p.GetName(ref sex); //這里將會把sex值改為女
Console.WriteLine("");
class Person {
public void GetName(ref string sex)
{
sex="女";
}
}
★★★★out關(guān)鍵字
out關(guān)鍵字和ref關(guān)鍵字很相似,out關(guān)鍵字也會導(dǎo)致參數(shù)通過引用來傳遞.與ref關(guān)鍵字不同之處在于
ref要求變量必須在傳遞之前進(jìn)行初始化.如果使用out關(guān)鍵字,方法定義和調(diào)用方法都必須顯示使用
out關(guān)鍵字.盡管作為out參數(shù)傳遞的變量不必再傳遞之前進(jìn)行初始化,但必須在方法中為out參數(shù)賦值.
在方法中傳遞參數(shù)時使用out關(guān)鍵字,便是這個變量要回傳值.最簡單的運(yùn)用時除法,例如你需要一個除
法方法,同時得到余數(shù)和商.但是普通的方法只能返回一個值,這個時候就可以使用out參數(shù),把另一個
值返回.
int i = 15;
int j = 6;
int yushu;
Person p = new Person();
Consol.WriteLine();
class Person{
public int GetShangYuShu(int i,int j, out int yushu){
yushu = i%j;
return i/j;
}
}
★★★★重載
在C#中,類成員都有一個唯一的簽名,而方法的簽名由名稱\參數(shù)個數(shù)和參數(shù)數(shù)據(jù)類型組成.只要簽名不
同,就可以在一種類型內(nèi)定義具有相同名稱的多種方法.當(dāng)定義兩種或多種具有相同名稱的方法時,就
稱重載.
通俗的講: 方法重載就是方法名相同,參數(shù)個數(shù)或參數(shù)類型不同.
string name ="小米";
int age = 21;
Peson p = new Person();
p.GetName();
p.GetName(name,age);
class Person{
public void GetName(){//重載方法1
//代碼
}
public void GetName(string name){ //重載方法2
//代碼
}
public void GetName(string name,int age){ //重載方法3
//代碼
}
}
★★★★靜態(tài)方法
定義靜態(tài)方法和定義非靜態(tài)方法相似,只是在定義靜態(tài)方法時,需要在返回類型前加static關(guān)鍵字.靜
態(tài)放在程序啟動時系統(tǒng)會在內(nèi)存里為靜態(tài)方法創(chuàng)建一個實(shí)例,不需要再手動去實(shí)例靜態(tài)方法.通過類名
可以直接調(diào)用靜態(tài)方法,還有就是靜態(tài)方法會在內(nèi)存中占一定的內(nèi)存空間.
在類中一旦定義了靜態(tài)方法,name在類中就可以直接通過類名調(diào)用靜態(tài)方法,并不需要通過實(shí)例化對象
訪問靜態(tài)方法.
注意:系統(tǒng)一旦為靜態(tài)方法分配了內(nèi)存空間,靜態(tài)方法就會一直占用.所以在系統(tǒng)內(nèi)存比較小時,盡量少
用靜態(tài)方法.
public static string GetName(){
return"www";
}
擴(kuò)展方法使你能夠向現(xiàn)有類型"添加",而無需創(chuàng)建新的派生類型\重新編譯或以其他方式修改原始類型
.擴(kuò)展方法是一種特殊的靜態(tài)方法,但可以像擴(kuò)展類型上的實(shí)例方法一樣進(jìn)行調(diào)用.因此,通過擴(kuò)咱方法
,就可以在不修改一個類型的前提下對一個類型進(jìn)行功能上的擴(kuò)充.
★★★★擴(kuò)展方法
擴(kuò)展方法使你能夠向現(xiàn)有類型"添加"方法,而無需創(chuàng)建新的派生類型,重新編譯或以其他方式修改原始類型.擴(kuò)展方法時一種特殊的靜態(tài)方法,但可以像擴(kuò)展類型上的實(shí)例方法一樣進(jìn)行調(diào)用.它定義在靜態(tài)類中,但可以在其他類的對象上像調(diào)用實(shí)例方法那樣進(jìn)行調(diào)用.因此,通過擴(kuò)展方法,就可以在不修改一個類的前提下對一個類進(jìn)行功能擴(kuò)充.
擴(kuò)展方法和一般的靜態(tài)方法的定義類似,唯一區(qū)別是在第一個參數(shù)的前面加上關(guān)鍵字this作為修飾符,同時第一個參數(shù)也決定了擴(kuò)展方法可以擴(kuò)展的類型.
public static class AddClass{
public static string GetLower(this string str)
{
return str.ToLower();
}
public static string GetName(this Student stu)
{
return "擴(kuò)展方法";
}
public static string GetCanShu(this Student stu,string str) //帶參數(shù)的擴(kuò)展方法
{
return str; //返回參數(shù)str
}
}
public class Student{
//這里沒有代碼
}
//----------調(diào)用代碼
string URL = "HTTP://WWW.XXX.COM"; //要轉(zhuǎn)化為小寫字母的字符串
URL.GetLower(); //結(jié)果: http://www.xxx.com
Student s = new Student(); //實(shí)例化Student類
s.GetNme(); //結(jié)果: 擴(kuò)展方法
string str = "擴(kuò)展方法參數(shù)" //結(jié)果:擴(kuò)展方法參數(shù)
//------------擴(kuò)展方法的特點(diǎn)
1.擴(kuò)展方法是給現(xiàn)有類型添加一個方法.
2.擴(kuò)展方法是通過制定關(guān)鍵字this修飾第一個參數(shù)
3.擴(kuò)展方法必須聲明在靜態(tài)類中.
4.擴(kuò)展方法要通用對象來調(diào)用.
5.擴(kuò)展方法可以帶參數(shù).
★★★★屬性
在C#編寫的程序中,屬性提供靈活的幾只讀取或編寫私有字段的值.使用屬性可以像使用公共數(shù)據(jù)成員一樣使用屬性,單實(shí)際上它們是稱作"訪問器"的特殊方法.這使得可以輕松訪問數(shù)據(jù),此外還有助于提高方法的安全性和靈活性.
對于類的實(shí)例化對象,屬性顯示為字段.對于類的構(gòu)造來說,屬性是一個或兩個代碼塊:表示一個get訪問器和set訪問器.當(dāng)讀取屬性時,執(zhí)行g(shù)et訪問器的代碼塊;當(dāng)向?qū)傩苑峙湟粋€新值時,執(zhí)行set訪問器的代碼塊.value關(guān)鍵字用于定義set索引器分配的值.
語法格式
public string PropertyName
{
get{
return "返回私有變量的值或返回其他一些有意義的值";
}
set{
//為屬性相關(guān)的私有變量賦值
}
}
例子:
public class Student{
string _name; //聲明私有字段
public string Name{
get{
return _name
}
set{
_name = value;
}
}
}
Student stu = new Student();
stu.name = "屬性";
//------set索引器可以進(jìn)行判斷,改寫代碼如下
set{
if(value=="屬性"){
_name = "你是輸入的是屬性,符合要求"
}else{
_name = "你輸入的非法";
}
}
以上看出在使用set索引器為屬性賦值時,可以對賦值的數(shù)據(jù)進(jìn)行判斷,提高安全性.
★★★★自動屬性
當(dāng)屬性訪問器中不需要其他邏輯時,自動實(shí)現(xiàn)的屬性可以使屬性聲明變得更加簡潔.
一旦在類中聲明了自動屬性,那么編譯器將創(chuàng)建一個私有的匿名后備字段,但是這個私有字段只能通過屬性的get和set訪問器進(jìn)行訪問.
自動屬性必須同時聲明get和set訪問器.若要穿件只讀自動屬性,必須在set訪問器前加private關(guān)鍵字.
聲明:
public class Student
{
public int Age{
set;
get;
}
}
Student stu = new Student();
stu.Age = 15;
//感覺自動屬性沒什么用!
★★★★構(gòu)造函數(shù)
構(gòu)造函數(shù)具有與類相同的名稱,他通常初始化新對象的數(shù)據(jù)成員.在類中不帶參數(shù)的構(gòu)造函數(shù)為類的默認(rèn)構(gòu)造函數(shù),除非類是static(即靜態(tài)類)的,否則C#編譯器將為無構(gòu)造函數(shù)的類提供一個公共的默認(rèn)構(gòu)造函數(shù),一便該類可以實(shí)例化.無論何時,只要使用new關(guān)鍵字實(shí)例化對象,不提供參數(shù)就會調(diào)用默認(rèn)構(gòu)造函數(shù).
注意: 如果構(gòu)造函數(shù)設(shè)置了私有構(gòu)造函數(shù)(使用private關(guān)鍵字),那么該類不能被實(shí)例化.
如果聲明的構(gòu)造函數(shù)帶有參數(shù),那么我們在實(shí)例化時也必須提供相應(yīng)的參數(shù),否則會出錯.但是同時有聲明了不帶參數(shù)的構(gòu)造函數(shù),就調(diào)用該構(gòu)造函數(shù),也就是說的重載.
構(gòu)造函數(shù)的特征:
1.類的構(gòu)造函數(shù)函數(shù)名與類名相同
2.構(gòu)造函數(shù)沒有返回值
3.一般情況構(gòu)造函數(shù)為public
★★★★對象初始化器
對象初始化器(Object Initializers)和集合初始化器(Collection Initializers)就是簡化代碼,讓本來幾行才能寫完的代碼一行寫完.
作用:可以在創(chuàng)建對象時向?qū)ο蟮娜魏慰稍L問的字段或?qū)傩再x值.
例子:
class Student{
public string name;
public string sex{get; set;} //自動屬性
}
Student stu = new Student{name = "名字",Sex = "男"}; //使用{}以;結(jié)束
Student stu = new Student{Sex = "男"}; //也可以只為其中一個字段賦值
★★★★析構(gòu)函數(shù)
在C#中很少使用析構(gòu)函數(shù),但是,當(dāng)應(yīng)用程序瘋長窗口,文件,網(wǎng)絡(luò)連接等這類非托管資源時,應(yīng)當(dāng)使用析構(gòu)函數(shù)釋放這些資源.
1.不能再結(jié)構(gòu)中定義析構(gòu)函數(shù),只能對類使用析構(gòu)函數(shù)
2.一個類只能有一個析構(gòu)函數(shù)
3.無法繼承或重載析構(gòu)函數(shù)
4.無法調(diào)用析構(gòu)函數(shù),他們被自動調(diào)用
5.析構(gòu)函數(shù)沒有修飾符,也沒有參數(shù)
例子:
public class Student{
~Student(){
//和類名相同,前面加~符合
}
}
★★★★readonly關(guān)鍵字
readonly修飾符只能用于字段(不能用于局部變量),只能在構(gòu)造函數(shù)和聲明中賦值.
例:
public class RendKey{
public readonly string Name;//聲明沒有賦值,只能在構(gòu)造函數(shù)中進(jìn)行賦值
public readonly string Age = 15; //聲明時賦值(正規(guī)書寫格式首字符大寫)
}
與const修飾符的區(qū)別
1.readonly修飾的字段即使在聲明時賦值了也可以在構(gòu)造函數(shù)中對其進(jìn)行更改. const修飾符聲明時必須賦值,以后任何情況下都不允許更改.readonly修飾符即可以是實(shí)例字段也可以是靜態(tài)字段.
2.將readonly應(yīng)用于一個數(shù)組,不會凍結(jié)數(shù)組的內(nèi)容.它只會凍結(jié)數(shù)組中的元素?cái)?shù)量,因?yàn)楝F(xiàn)在無法將只讀字段重新賦值為一個新的實(shí)例,數(shù)組中的元素仍然是可寫的.
★★★★類的繼承
類了除了繼承于類還可以繼承于接口,C#中類只能繼承一個類,多重繼承使用繼承多個接口來實(shí)現(xiàn).
子類從父類中繼承了所有非私有數(shù)據(jù)和行為(屬性,方法),可以說子類是對父類的擴(kuò)展,但是構(gòu)造函數(shù)和析構(gòu)函數(shù)是不會被繼承的.
語法格式:
public class BaseClass{
//父類
}
public class MyClass : BaseClass{
//子類
}
★★★★虛方法
在一個基類中,使用virtual修飾符修飾方法,屬性,索引器或事件聲明,那么他們就可以在派生類中被重寫.使用
virtual關(guān)鍵字在基類中修飾的方法,就是平常所說的虛方法.在派生類中使用override關(guān)鍵字重寫虛方法.
注意:成員字段和靜態(tài)方法都不能聲明為virtual,因?yàn)檫@個概念只對類中實(shí)例成員有意義.
class Person {
public virtual void Work(){
Console.WriteLine("這是一個虛方法");
}
}
class Student : Person{
public override void Work(){
Console.WriteLine("通過override關(guān)鍵字重寫Work虛方法");
}
}
Student stu = new Stutent(); //實(shí)例化Student類
stu.Work();
★★★★調(diào)用方法的基類版本
在派生類中,可以使用base關(guān)鍵字訪問基類成員,base關(guān)鍵字指定創(chuàng)建派生類實(shí)例時應(yīng)用調(diào)用的基類構(gòu)造函數(shù),但
是不能在靜態(tài)方法中使用base關(guān)鍵字.
1.關(guān)鍵字用于從派生類中訪問基類的成員:
2.調(diào)用基類上已被其他方法重寫的方法。
3.指定創(chuàng)建派生類實(shí)例時應(yīng)調(diào)用的基類構(gòu)造函數(shù)。
4.基類訪問只能在構(gòu)造函數(shù)、實(shí)例方法或?qū)嵗龑傩栽L問器中進(jìn)行。
★★★★隱藏方法
在派生類中,使用new關(guān)鍵字可以顯示隱藏從基類繼承的成員.若要隱藏繼承的成員,請使用相同名稱在派生類中
聲明該成員,并用new修飾符修飾它,該成員就是獨(dú)立于基類的方法.
例子:
class Person{
public string name = "小王";
public string sex ="男";
public void WriteInfo()
{
Console.WriteLine("人員信息:姓名{0},性別:{1}",name,sex);
}
}
class Student : Person
{
new public void WriteInfo(){
Consol.WriteLine("學(xué)生信息:姓名{0},性別:{1}",name,sex);
}
}
Student s = new Student();
s.WriteInfo();//這里調(diào)用子類的WriteInfo()方法
★★★★C#中重寫父類方法的幾種情況
關(guān)鍵字:virtual、abstract、override、new。
1. virtual:標(biāo)識可能但不是必須被子類重寫的方法,父類必須給出默認(rèn)實(shí)現(xiàn),子類可以重寫(使用
override,new,或無特殊標(biāo)識的普通方法),也可以不重寫該方法。
2. abstract:標(biāo)識必須被子類重寫的方法,父類并不給出實(shí)現(xiàn),子類必須用override關(guān)鍵字重寫該方法。
3. override:標(biāo)識重寫父類的方法,父類方法必須是用abstract,virtual,override之一聲明,運(yùn)行時將根
據(jù) 實(shí)例的類型而不是引用的類型調(diào)用對象的方法。
4. new:標(biāo)識重寫父類的方法,父類方法可以用virtual、override、new之一聲明,也可以是沒有特殊標(biāo)識的
普 通方法,運(yùn)行時會根據(jù)引用的類型選擇調(diào)用父類還是子類的方法,重寫父類方法時,使用new關(guān)鍵字與使
用沒 有特殊標(biāo)識的普通方法是等效的,但是后者會給出一個編譯警告。
★★★★抽象類和抽象方法
抽象類是一種特殊的類,他可以擁有數(shù)據(jù)成員,可以是其他類的子類.但是和具體類(非抽象類)不同,抽象類的某
些行為故意留給其子類來定義.
在C#中使用abstract關(guān)鍵字聲明抽象類.abstract關(guān)鍵字可以和方法,屬性,索引器及事件一起使用.標(biāo)記為抽象
或包含在抽象類中的成員必須通過從抽象類的子類中在實(shí)現(xiàn).
注意:抽象類不能夠?qū)嵗?需要通過子類重寫抽象類中的成員方法,然后實(shí)例化子類來實(shí)現(xiàn).
抽象方法也是由關(guān)鍵字abstract聲明,抽象方法需要使用;號結(jié)束,這和常規(guī)定義的方法塊不同.抽象方法只能在
抽象類中聲明.
例子:
class Person{
public abstract void Work(); //定義了一個抽象類
}
class Student{
public override void Work(){//使用override關(guān)鍵字重寫抽象類
Console.WriteLine("重寫抽象方法");
}
}
Student s = new Student();
s.Work();
★★★★密封類和密封方法
在應(yīng)用程序中,有時候開發(fā)人員編寫的類,并不希望被繼承或沒有必要被繼承,為此C#提出了密封類的概念,密封
類在聲明中使用sealed關(guān)鍵字.這樣就可以防止類別其他類繼承.
密封類可以組織其他開放人員在無意中繼承,而且密封類可以起到運(yùn)行時優(yōu)化效果.
如果視圖將一個密封類作為其他類的基類,C#將提示出錯.密封類不能同時又是抽象類,因?yàn)槌橄箢愂切枰焕^承
的,可以說sealed關(guān)鍵字不能喝abstract關(guān)鍵字一起使用.
密封類不可能有派生類,如果密封類實(shí)例中存在虛成員函數(shù),該成員方法可以轉(zhuǎn)化為非xude ,方法關(guān)鍵字將不再
生效.
class Person{
public virtual void Work(){
Console.WriteLine("聲明封閉類時需要繼承一個父類,不能直接聲明");
}
}
sealed class Student : Person //使用sealed關(guān)鍵字聲明封閉類
{
public sealed override void Work(){
Console.WriteLine("使用sealed關(guān)鍵重寫父類的方法");
}
}
Student s = new Student();
s.Work();
★★★★部分類
★★★★接口
在應(yīng)用程序中,接口就是一種規(guī)范,接口封裝了可以被多個類繼承的一些公共部分.但是接口不能包含字段.聲明
接口使用interface關(guān)鍵字,接口中的成員默認(rèn)是public,所以在聲明成名方法時不需要加public關(guān)鍵字.接口中
的成員必須是非靜態(tài)的.
例子:
interface Person{
//string name; 如果包含字段,程序?qū)?bào)錯.
void Work();
}
class Student : Person{
public void Work(){
Console.WriteLine("這個類繼承與接口類Person");
}
}
Student s = new Student();
s.Work();