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