生活随笔
收集整理的這篇文章主要介紹了
C# 备忘录
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
①訪(fǎng)問(wèn)限制
public:所有類(lèi)均可使用internal:同一命名空間(程序集)中的類(lèi)可以使用protected:在本類(lèi)中及其子類(lèi)中可以使用private:只能在本類(lèi)中使用,默認(rèn)。? ? ?從上到下,訪(fǎng)問(wèn)限制逐漸升高
②using用法
引入命名空間定義別名定義臨時(shí)塊范圍,在該范圍結(jié)束時(shí)回收資源。③new用法
用作運(yùn)算符:創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù)。?用作修飾符:隱藏從基類(lèi)繼承的屬性、字段、方法(因?yàn)椴荒軇h除,所以選擇隱藏),用于關(guān)閉警告。用作約束:在泛型聲明中約束可能用作類(lèi)型參數(shù)的參數(shù)類(lèi)型。④常用快捷鍵
進(jìn)入MSDN/查看幫助:F1啟動(dòng)調(diào)試:F5,直接運(yùn)行:Ctrl+F5試圖轉(zhuǎn)向代碼:F7,代碼轉(zhuǎn)向試圖:Ctrl+F7設(shè)置/取消斷點(diǎn):F9單步調(diào)試:F10逐句調(diào)試:F11轉(zhuǎn)到定義處:F12⑤重載、重寫(xiě)、覆蓋
重載指的是同一個(gè)類(lèi)中有兩個(gè)或多個(gè)名字相同但是參數(shù)個(gè)數(shù)、次序、類(lèi)型不同的方法,(注:返回值可相同可不同),重載沒(méi)有關(guān)鍵字。override:重寫(xiě)是指子類(lèi)對(duì)父類(lèi)中虛函數(shù)或抽象函數(shù)的“覆蓋”,實(shí)現(xiàn)新的功能,它必須和父類(lèi)方法的方法名、參數(shù)、返回類(lèi)型、訪(fǎng)問(wèn)修飾符完全一致。但是這種“覆蓋”和用new關(guān)鍵字來(lái)覆蓋是有區(qū)別的,通過(guò)指向子類(lèi)的父類(lèi)對(duì)象不能調(diào)用到被重寫(xiě)的父類(lèi)方法,但父類(lèi)對(duì)象本身仍可以調(diào)用到父類(lèi)方法。new:覆蓋指的是不同類(lèi)中(基類(lèi)或派生類(lèi))有兩個(gè)或多個(gè)返回類(lèi)型、方法名、參數(shù)都相同,但是方法體不同的方法。但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏,通過(guò)指向子類(lèi)的父類(lèi)對(duì)象可以調(diào)用到被重寫(xiě)的父類(lèi)方法,父類(lèi)對(duì)象本身當(dāng)然也可以調(diào)用到父類(lèi)方法。? ? ? 綜上:
重載,必然發(fā)生在一個(gè)類(lèi)中,函數(shù)名相同,參數(shù)類(lèi)型或者順序不同構(gòu)成重載,與返回類(lèi)型無(wú)關(guān)重寫(xiě),必然發(fā)生在基類(lèi)和派生類(lèi)中,基類(lèi)函數(shù)用virtual或abstract修飾,派生類(lèi)用override修飾覆蓋,在子類(lèi)中寫(xiě)一個(gè)和基類(lèi)一樣名字(參數(shù)不同也算)的非虛函數(shù),會(huì)讓基類(lèi)中的函數(shù)被隱藏,編譯后會(huì)提示要求使用New關(guān)鍵字⑥結(jié)構(gòu)struct與類(lèi)class的區(qū)別
????1. 值類(lèi)型與引用類(lèi)型?
????????結(jié)構(gòu)是值類(lèi)型:值類(lèi)型在堆棧上分配地址,所有的基類(lèi)型都是結(jié)構(gòu)類(lèi)型,例如:int 對(duì)應(yīng)System.int32 結(jié)構(gòu),通過(guò)使用結(jié)構(gòu)可以創(chuàng)建更多的值類(lèi)型?
????????類(lèi)是引用類(lèi)型:引用類(lèi)型在堆上分配地址 ,例如string
????????堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象。所以結(jié)構(gòu)處理作為基類(lèi)型對(duì)待的小對(duì)象,而類(lèi)處理某個(gè)商業(yè)邏輯?
????????因?yàn)榻Y(jié)構(gòu)是值類(lèi)型,所以結(jié)構(gòu)之間的賦值是創(chuàng)建新的結(jié)構(gòu),而類(lèi)是引用類(lèi)型,類(lèi)之間的賦值只是復(fù)制引用?
????注:?
????????a.雖然結(jié)構(gòu)與類(lèi)的類(lèi)型不一樣,可是他們的基類(lèi)型都是對(duì)象(object),c#中所有類(lèi)型的基類(lèi)型都是object?
????????b.雖然結(jié)構(gòu)的初始化也使用了New 操作符可是結(jié)構(gòu)對(duì)象依然分配在堆棧上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用?
????2.繼承性?
????????結(jié)構(gòu):不能從另外一個(gè)結(jié)構(gòu)或者類(lèi)繼承,本身也不能被繼承,雖然結(jié)構(gòu)沒(méi)有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的sealed .?
????????類(lèi):完全可擴(kuò)展的,除非顯示的聲明sealed 否則類(lèi)可以繼承其他類(lèi)和接口,自身也能被繼承?
????????注:雖然結(jié)構(gòu)不能被繼承,可是結(jié)構(gòu)能夠繼承接口,方法和類(lèi)繼承接口一樣?
????3.內(nèi)部結(jié)構(gòu):?
????????結(jié)構(gòu):?
????????????沒(méi)有默認(rèn)的構(gòu)造函數(shù),但是可以添加構(gòu)造函數(shù) (結(jié)構(gòu)體中不能定義默認(rèn)的、不帶參數(shù)的構(gòu)造函數(shù),只能定義帶參的構(gòu)造函數(shù))
????????????沒(méi)有析構(gòu)函數(shù)?
????????????沒(méi)有 abstract 和 sealed(因?yàn)椴荒芾^承)?
????????????不能有protected 修飾符?
????????????可以不使用new 初始化?
????????????在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的?
????????類(lèi):?
????????????有默認(rèn)的構(gòu)造函數(shù)?(可以定義默認(rèn)的、不帶參數(shù)的構(gòu)造函數(shù),或者帶參的構(gòu)造函數(shù))
????????????有析構(gòu)函數(shù)?
????????????可以使用 abstract 和 sealed?
????????????有protected 修飾符?
????????????必須使用new 初始化
⑦實(shí)例化過(guò)程、this、base
????1)先不考慮繼承關(guān)系,執(zhí)行順序?yàn)?#xff1a;
????????靜態(tài)字段
????????靜態(tài)構(gòu)造方法
????????實(shí)例字段
????????實(shí)例構(gòu)造方法
????2)考慮繼承關(guān)系,執(zhí)行順序?yàn)?#xff1a;
????????子類(lèi)的靜態(tài)字段
????????子類(lèi)的靜態(tài)構(gòu)造方法
????????子類(lèi)的實(shí)例字段
????????父類(lèi)的靜態(tài)字段
????????父類(lèi)的靜態(tài)構(gòu)造方法
????????父類(lèi)的實(shí)例字段
????????父類(lèi)的實(shí)例構(gòu)造方法
????????子類(lèi)的實(shí)例構(gòu)造方法
? ? 3)this關(guān)鍵字?
????????this關(guān)鍵字代表當(dāng)前對(duì)象,通過(guò)this關(guān)鍵字可以訪(fǎng)問(wèn)當(dāng)前對(duì)象的成員。(當(dāng)前對(duì)象的成員:自己本身的成員+從父類(lèi)繼承過(guò)來(lái)的所有的成員。)
????????this關(guān)鍵字可以訪(fǎng)問(wèn):本類(lèi)的所有成員和父類(lèi)的非私有成員。父類(lèi)的私有成員確實(shí)存在,但是就是訪(fǎng)問(wèn)不到。
????????this關(guān)鍵字仍然代表的是對(duì)象,通過(guò)它可以點(diǎn)出對(duì)象中的除了父類(lèi)的私有成員以外的所有成員。
????????this關(guān)鍵字只能用在實(shí)例方法中。
????????作用:
????????????1)代表當(dāng)前對(duì)象。在實(shí)例方法中使用this關(guān)鍵字就代表當(dāng)前對(duì)象。通過(guò)this關(guān)鍵字可以點(diǎn)出本類(lèi)的所有成員和父類(lèi)的非私有成員。
????????????2)調(diào)用本類(lèi)的其他的構(gòu)造函數(shù)。在構(gòu)造函數(shù)的后面的this代表調(diào)用本類(lèi)的其他的構(gòu)造函數(shù)。
? ? 4)base關(guān)鍵字
????????顯示的訪(fǎng)問(wèn)父類(lèi)的非私有成員。可以訪(fǎng)問(wèn)子類(lèi)對(duì)象中的父類(lèi)的非私有成員。base不代表父類(lèi)對(duì)象。因?yàn)閴焊蜎](méi)有父類(lèi)對(duì)象。通過(guò)它可以訪(fǎng)問(wèn)到父類(lèi)的非私有成員。通過(guò)this關(guān)鍵字訪(fǎng)問(wèn)當(dāng)前對(duì)象的成員的時(shí)候:先找子類(lèi)本身有沒(méi)有這個(gè)成員,如果沒(méi)有再找是否有從父類(lèi)繼承過(guò)來(lái)的。base關(guān)鍵字 直接就找父類(lèi)中的成員。我們發(fā)現(xiàn),base可以點(diǎn)出來(lái)的成員,通過(guò)this都可以點(diǎn)出來(lái)訪(fǎng)問(wèn)。
????????建議:如果我們?cè)L問(wèn)的確實(shí)是從父類(lèi)繼承過(guò)來(lái)的,那么建議用base關(guān)鍵字訪(fǎng)問(wèn),這樣方便代碼的閱讀和提高效率。只有在訪(fǎng)問(wèn)的成員確實(shí)是子類(lèi)獨(dú)有的,那么我們才用this關(guān)鍵字。
????????作用:
????????????1)在實(shí)例方法中,通過(guò)base關(guān)鍵字可以顯示的訪(fǎng)問(wèn)子類(lèi)對(duì)象中的非私有的父類(lèi)成員。
????????????2)調(diào)用父類(lèi)的構(gòu)造函數(shù)。在子類(lèi)的構(gòu)造函數(shù)的后面的base代表調(diào)用父類(lèi)的構(gòu)造函數(shù)。
⑧抽象類(lèi)abstract,接口interface,密封類(lèi)sealed
? ? 1)abstract修飾符可以和類(lèi),方法,屬性,索引及事件一起使用。
????在類(lèi)聲明時(shí)使用abstract修飾符,以指示該類(lèi)只能是其他類(lèi)的基類(lèi),標(biāo)記為抽像或包含在抽像類(lèi)中的成員必須在抽像類(lèi)的派生類(lèi)中實(shí)現(xiàn);
????抽象類(lèi)特性:
????????抽像類(lèi)不能實(shí)例化。
????????抽像類(lèi)可以包含抽象方法和抽像訪(fǎng)問(wèn)器。
????????不能用sealed修飾符修改抽像類(lèi)。
????抽像方法特性:
????????是隱式的virtual方法。
????????只能在抽像類(lèi)中使用抽像方法聲明。
????????不提供實(shí)際的實(shí)現(xiàn)。
????????具體實(shí)現(xiàn)由override方法提供,它是非抽像類(lèi)的成員。
????????使用static或virtual修飾符是錯(cuò)誤的。
????即:abstract是一種抽象,好比上帝,是人們對(duì)神的抽象,看似什么都能做,其實(shí)什么都做不了。
????2)接口的定義:
????????接口的定義是指定一組函數(shù)成員而不實(shí)現(xiàn)成員的引用類(lèi)型,其它類(lèi)型和接口可以繼承接口。
????????接口主要有以下特點(diǎn):
????????????1)通過(guò)接口可以實(shí)現(xiàn)多重繼承,C#接口的成員不能有public、protected、internal、private等修飾符。原因很簡(jiǎn)單,接口里面的方法都需要由外面接口實(shí)現(xiàn)去實(shí)現(xiàn)方法體,那么其修飾符必然是public。C#接口中的成員默認(rèn)是public的,java中是可以加public的。
????????????2)接口成員不能有new、static、abstract、override、virtual修飾符。有一點(diǎn)要注意,當(dāng)一個(gè)接口實(shí)現(xiàn)一個(gè)接口,這2個(gè)接口中有相同的方法時(shí),可用new關(guān)鍵字隱藏父接口中的方法。
????????????3)接口中只包含成員的簽名,接口沒(méi)有構(gòu)造函數(shù),所有不能直接使用new對(duì)接口進(jìn)行實(shí)例化。接口中只能包含方法、屬性、事件和索引的組合。接口一旦被實(shí)現(xiàn),實(shí)現(xiàn)類(lèi)必須實(shí)現(xiàn)接口中的所有成員,除非實(shí)現(xiàn)類(lèi)本身是抽象類(lèi)。
????????????4)C#是單繼承,接口是解決C#里面類(lèi)可以同時(shí)繼承多個(gè)基類(lèi)的問(wèn)題。
????3)接口和抽象類(lèi)的區(qū)別:
????????接口用于規(guī)范,抽象類(lèi)用于共性。抽象類(lèi)是類(lèi),所以只能被單繼承,但是接口卻可以一次實(shí)現(xiàn)多個(gè)。
????????接口中只能聲明方法,屬性,事件,索引器。而抽象類(lèi)中可以有方法的實(shí)現(xiàn),也可以定義非靜態(tài)的類(lèi)變量。
????????抽象類(lèi)可以提供某些方法的部分實(shí)現(xiàn),接口不可以。抽象類(lèi)的實(shí)例是它的子類(lèi)給出的。接口的實(shí)例是實(shí)現(xiàn)接口的類(lèi)給出的。
????????在抽象類(lèi)中加入一個(gè)方法,那么它的子類(lèi)就同時(shí)有了這個(gè)方法。而在接口中加入新的方法,那么實(shí)現(xiàn)它的類(lèi)就要重新編寫(xiě)(這就是為什么說(shuō)接口是一個(gè)類(lèi)的規(guī)范了)。
????????接口成員被定義為公共的,但抽象類(lèi)的成員也可以是私有的、受保護(hù)的、內(nèi)部的或受保護(hù)的內(nèi)部成員(其中受保護(hù)的內(nèi)部成員只能在應(yīng)用程序的代碼或派生類(lèi)中訪(fǎng)問(wèn))。此外接口不能包含字段、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員或常量。
????????還有一點(diǎn),我們?cè)赩S中實(shí)現(xiàn)接口時(shí)會(huì)發(fā)現(xiàn)有2個(gè)選項(xiàng),一個(gè)是實(shí)現(xiàn)接口,一個(gè)是顯示實(shí)現(xiàn)接口。實(shí)現(xiàn)接口就是我們平常理解的實(shí)現(xiàn)接口,而顯示實(shí)現(xiàn)接口的話(huà),實(shí)現(xiàn)的方法是屬于接口的,而不是屬于實(shí)現(xiàn)類(lèi)的。
4)密封類(lèi)sealed
????????密封類(lèi)不能被繼承,
????????密封方法可以重寫(xiě)基類(lèi)中的方法,但其本身不能在任何派生類(lèi)中進(jìn)一步重寫(xiě),當(dāng)應(yīng)用于方法或?qū)傩詴r(shí),sealed修飾符必須始終于override一起使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace PetShop
{/// <summary>/// 接口interface:指定一組成員函數(shù),但本身不實(shí)現(xiàn)它們/// </summary>interface ICatchMice{/// <summary>/// 默認(rèn)public,但不能加public/// </summary>void CatchMice();}interface IClimbTree{void ClimbTree();}/// <summary>/// 父類(lèi)、基類(lèi),所有類(lèi)都繼承于Object,省略時(shí)默認(rèn)繼承于Object/// </summary>public class Pet{protected string name;protected int age;/// <summary>/// 構(gòu)造函數(shù)/// </summary>public Pet() { }public Pet(string name) {this.name = name;this.age = 0;}/// <summary>/// 成員函數(shù)/// </summary>public void PrintName(){Console.WriteLine("Pet`s name is " + this.name);}public void PrintAge(){Console.WriteLine(this.name + "`s age is " + this.age);}/// <summary>/// 虛方法/// </summary>virtual public void Speak(){Console.WriteLine("Pet is speaking");}/// <summary>/// 重載運(yùn)算符/// </summary>/// <param name="pet">Pet對(duì)象</param>/// <returns>將Pet對(duì)象的年齡加1后返回</returns>public static Pet operator ++(Pet pet){++pet.age;return pet;}/// <summary>/// 泛型方法:可以包含在泛型類(lèi)中,也可以包含在普通類(lèi)中/// 約束規(guī)則:一個(gè)泛型類(lèi)(類(lèi)名或class或struct),多個(gè)接口(接口名),new()/// </summary>/// <param name="target">T類(lèi)型的對(duì)象</param>public void IsHappy<T>(T target) where T:Pet{Console.WriteLine(target.ToString()+ " is happy");}}/// <summary>/// 單繼承:只能繼承于一個(gè)父類(lèi)/// </summary>public class Dog : Pet{/// <summary>/// 靜態(tài)成員字段/// </summary>static int num;/// <summary>/// 委托與事件發(fā)布者/// </summary>public delegate void Handler();public static event Handler NewDog;/// <summary>/// 靜態(tài)構(gòu)造方法中不允許出現(xiàn)訪(fǎng)問(wèn)修飾符/// </summary>static Dog(){num = 0;}/// <summary>/// this表示當(dāng)前對(duì)象,base表示父類(lèi)對(duì)象/// </summary>/// <param name="name">初始化名字</param>public Dog(string name):base(name){//this.name = name;num++;//觸發(fā)事件if (NewDog != null){NewDog();}}/// <summary>/// 隱藏/// </summary>new public void PrintName(){Console.WriteLine("寵物狗的名字是" + this.name);}/// <summary>/// 重寫(xiě)/// </summary>override public void Speak(){Console.WriteLine("Dog is speaking" + " wow");}/// <summary>/// 靜態(tài)方法只能訪(fǎng)問(wèn)靜態(tài)成員,非靜態(tài)方法可以訪(fǎng)問(wèn)靜態(tài)也可以訪(fǎng)問(wèn)非靜態(tài)成員/// 靜態(tài)方法只能通過(guò)類(lèi)名調(diào)用,非靜態(tài)方法只能通過(guò)對(duì)象訪(fǎng)問(wèn)/// </summary>public static void ShowNum(){Console.WriteLine("Dog's number is " + num);}/// <summary>/// 自定義類(lèi)的隱式轉(zhuǎn)換/// </summary>/// <param name="dog">原始類(lèi)對(duì)象</param>/// <returns>目標(biāo)類(lèi)對(duì)象</returns>public static implicit operator Cat(Dog dog){return new Cat(dog.name);}/// <summary>/// 被委托方法/// </summary>public void WagTail(){Console.WriteLine(this.name + " wag tail");}}/// <summary>/// 類(lèi)是單繼承,接口是多實(shí)現(xiàn)/// </summary>public class Cat : Pet,ICatchMice,IClimbTree{public Cat(string name):base(name){//this.name = name;}/// <summary>/// 隱藏/// </summary>new public void PrintName(){Console.WriteLine("寵物貓的名字是" + this.name);}/// <summary>/// 重寫(xiě)/// </summary>override public void Speak(){Console.WriteLine("Cat is speaking" + " mom");}/// <summary>/// 必須實(shí)現(xiàn)接口里的全部函數(shù)/// </summary>public void CatchMice(){Console.WriteLine("Catch Mice");}public void ClimbTree(){Console.WriteLine("Climb Tree");}/// <summary>/// 自定義類(lèi)的顯式轉(zhuǎn)換/// </summary>/// <param name="cat">原始類(lèi)對(duì)象</param>/// <returns>目標(biāo)類(lèi)對(duì)象</returns>public static explicit operator Dog(Cat cat){return new Dog(cat.name);}/// <summary>/// 被委托方法/// </summary>public void InnocentLook(){Console.WriteLine(this.name + " innocent look");}}/// <summary>/// 實(shí)現(xiàn)泛型接口/// </summary>public class Labrador : Dog, ILearn<SitDogCmd>, ILearn<SpeakDogCmd>{public Labrador(string name) : base(name) { }public void Act(SitDogCmd cmd){Console.WriteLine(cmd.GetCmd());}public void Act(SpeakDogCmd cmd){Console.WriteLine(cmd.GetCmd());}}/// <summary>/// 抽象類(lèi),抽象方法/// </summary>public abstract class DogCmd{public abstract string GetCmd();}/// <summary>/// 實(shí)現(xiàn)抽象類(lèi),重寫(xiě)抽象方法/// </summary>public class SitDogCmd : DogCmd{public override string GetCmd(){return "Sit Down";}}public class SpeakDogCmd : DogCmd{public override string GetCmd(){return "wow";}}/// <summary>/// 繼承抽象類(lèi)并實(shí)現(xiàn)抽象屬性或抽象方法/// </summary>public class DogFood:Food{private double weight;/// <summary>/// 使用override重寫(xiě)抽象屬性/// </summary>override public double Weight {get { return weight; }set { weight = value; }}/// <summary>/// 使用override重寫(xiě)抽象方法/// </summary>public override void NiceFood(){Console.WriteLine("大黃牌狗糧");}}/// <summary>/// 靜態(tài)類(lèi)/// </summary>public static class PetGuide{/// <summary>/// 靜態(tài)方法與靜態(tài)類(lèi)之間沒(méi)有必然關(guān)系(類(lèi)似sealed)/// </summary>/// <param name="dog"></param>public static void HowToFeed(this Dog dog){Console.WriteLine("play a vedio about how to feed dog!");}}/// <summary>/// 泛型類(lèi):類(lèi)的模板/// </summary>/// <typeparam name="T">具體類(lèi)型</typeparam>public class Cage<T> where T:Pet{T[] PetArr;readonly int ArrSize;int num;public Cage(int n){ArrSize = n;num = 0;PetArr = new T[ArrSize];}public void PutIn(T pet){if (num < ArrSize){PetArr[num++] = pet;}else{Console.WriteLine("Cage is full!");}}public T TakeOut(){if (num > 0){return PetArr[--num];}else{Console.WriteLine("Cage is empty!");return default(T);}}}/// <summary>/// 泛型接口:接口的模板/// </summary>/// <typeparam name="T"></typeparam>interface ILearn<C> where C:DogCmd{void Act(C cmd);}/// <summary>/// 事件的訂閱者/// </summary>public class Client{public void WangADog(){Console.WriteLine("Great! I want to see the new dog");}}class Program{/// <summary>/// 委托方法/// </summary>delegate void ActCute();static void Main(string[] args){//繼承,隱藏,虛方法,構(gòu)造方法{Pet pet = new Pet("萌萌");pet.PrintName();pet.Speak();Dog dog = new Dog("小白");dog.PrintName();dog.Speak();Cat cat = new Cat("小花");cat.PrintName();cat.Speak();}// 使用基類(lèi)類(lèi)型的數(shù)組作為對(duì)象容器{Pet[] pets = new Pet[] { new Pet("萌萌"), new Dog("小白"), new Cat("小花") };foreach (Pet p in pets){p.PrintName();p.Speak();}}//抽象類(lèi)與抽象方法{DogFood dogFood = new DogFood();dogFood.Weight = 50;dogFood.NiceFood();}//實(shí)現(xiàn)接口{Cat cat2 = new Cat("Tom");ICatchMice icm = (ICatchMice)cat2;IClimbTree ict = (IClimbTree)cat2;cat2.CatchMice();//通過(guò)類(lèi)調(diào)用實(shí)現(xiàn)了的接口函數(shù)icm.CatchMice();//通過(guò)接口調(diào)用其中包含的函數(shù)cat2.ClimbTree();ict.ClimbTree();}//靜態(tài)成員{Dog.ShowNum();}//靜態(tài)類(lèi){Dog dog2 = new Dog("激萌的小黑");dog2.HowToFeed();}//裝箱與拆箱{int i = 5;object o = i;//自動(dòng)裝箱:將值類(lèi)型轉(zhuǎn)換為引用類(lèi)型i = 10;o = 20;int j = (int)o;//手動(dòng)拆箱:將裝箱后的對(duì)象轉(zhuǎn)換為值類(lèi)型Console.WriteLine("i = " + i + ",o = " + o + ",j = " + j);}//自定義類(lèi)轉(zhuǎn)換{Dog dog3 = new Dog("激萌的小黃");dog3.PrintName(); dog3.Speak();Cat cat3 = dog3;cat3.PrintName(); cat3.Speak();Dog dog4 = (Dog)cat3;dog4.PrintName(); dog4.Speak();}// 重載運(yùn)算符Pet[] petss = new Pet[] { new Pet("萌萌"), new Dog("小白"), new Cat("小花") };for (int i = 0; i < petss.Length; i++)//此處注意for與foreach的區(qū)別{petss[i].PrintAge();petss[i]++;petss[i].PrintAge();}//泛型類(lèi):功能類(lèi)似一個(gè)類(lèi)模板{var DogCage = new Cage<Dog>(1);DogCage.PutIn(new Dog("A"));DogCage.PutIn(new Dog("B"));DogCage.TakeOut().PrintName();//DogCage.TakeOut().PrintName();var CatCage = new Cage<Cat>(1);CatCage.PutIn(new Cat("C"));CatCage.PutIn(new Cat("D"));CatCage.TakeOut().PrintName();//CatCage.TakeOut().PrintName();}//泛型方法:方法的模板{new Pet().IsHappy<Cat>(new Cat("B"));//new Pet().IsHappy<int>(3);}//約束:縮小泛型參數(shù)的范圍,可應(yīng)用于泛型類(lèi)和泛型方法{var DogCage = new Cage<Dog>(1);DogCage.PutIn(new Dog("A"));DogCage.TakeOut().PrintName();//var icCage = new Cage<IClimbTree>(1);new Pet().IsHappy<Cat>(new Cat("B"));//new Pet().IsHappy<int>(3);}//泛型接口{Labrador dog = new Labrador("A");dog.Act(new SitDogCmd());dog.Act(new SpeakDogCmd());}//列表List,動(dòng)態(tài)數(shù)組ArrayList,字典Dictionary,棧Stack,隊(duì)列Queue{List<Pet> plist = new List<Pet>();plist.Add(new Pet("萌萌"));plist.Add(new Dog("小白"));plist.Add(new Cat("小花"));plist.RemoveAt(1);foreach (Pet p in plist){p.PrintName();}Dictionary<string, Dog> ddic = new Dictionary<string, Dog>();ddic.Add("A", new Dog("A"));ddic.Add("B", new Dog("B"));ddic.Add("C", new Dog("C"));ddic["A"].PrintName();Stack<Pet> pstack = new Stack<Pet>();pstack.Push(new Dog("AA"));pstack.Push(new Cat("BB"));pstack.Peek().PrintName();pstack.Pop();pstack.Peek().PrintName();pstack.Pop();Queue<Pet> pqueue = new Queue<Pet>();pqueue.Enqueue(new Dog("AAA"));pqueue.Enqueue(new Cat("BBB"));pqueue.Dequeue().PrintName();pqueue.Dequeue().PrintName();}//委托{ActCute actCute = new Dog("A").WagTail;actCute += new Cat("B").InnocentLook;actCute();}//Lambda表達(dá)式{ActCute actCute = new Dog("A").WagTail;actCute += new Cat("B").InnocentLook;actCute += () =>{Console.WriteLine("do nothing");};actCute();}//事件:發(fā)布者,訂閱者,觸發(fā)事件,注冊(cè)事件{Client c1 = new Client();Client c2 = new Client();// 注冊(cè)事件Dog.NewDog += c1.WangADog;Dog.NewDog += c1.WangADog;new Dog("小Q");}}}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace PetShop
{/// <summary>/// 包含抽象方法的類(lèi)是抽象類(lèi)/// </summary>abstract public class Food{public double price;/// <summary>/// 抽象屬性/// </summary>abstract public double Weight{get;set;}/// <summary>/// 抽象方法/// </summary>abstract public void NiceFood();}
}
課程地址:
https://www.imooc.com/learn/422
https://www.imooc.com/learn/554
https://www.imooc.com/learn/806
轉(zhuǎn)載于:https://my.oschina.net/MasterLi161307040026/blog/1648809
總結(jié)
以上是生活随笔為你收集整理的C# 备忘录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。