正如標題所說的那樣,到底是那些.NET的知識點呢?
接下來就讓我帶著你們去了解這些知識點吧!
1.接口
2.索引器
3.FOREACH的本質
4.匿名內部類
5.運算符的重載
一.什麼是接口?接口的作用又是什麼呢?如果不是太清楚或者是其他什麼的,那就請在認真、完整的浏覽幾遍吧!我想對你以後應該有很大的幫助。
解析:接口是組件之間的協議,描述了組件對外提供的服務。從技術上講接口是一組包含了函數型方法的數據結構。通過這組數據結構,客戶代碼可以調用組件對象的功能。接口可以從父接口中繼承。接口的繼承首先是說明性繼承,不是實現性繼承,它的實現需要通過類或結構來實現;其次接口繼承可以是多繼承。
作用:
01.接口就是為了約束方法的格式(參數和返回值類型)而存在的
02.接口可以實現多繼承,彌補單繼承的缺陷。
03.接口可以看成是一個特殊的抽象類,通過反編譯看源碼可知
04.接口中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體
05.如果一個類實現了某個接口,就得實現該接口中所有的方法
06.接口要謹慎使用,防止出現接口污染!
07.接口僅僅代表一種能力,實現該接口的類和接口沒有繼承關系
08.接口是用來實現的,類是用來繼承的。
09.其實很多時候,看似可以不用接口,因為接口就是一個方法的約定,
表明你這個類必須要有某些方法,但是不寫接口也可以有這些方法,用了接口,
就可以使用接口變量,統一調用,實現多態
1.創建接口並讓一個類去實現這個接口
public class Person:IFly { public string Say(string name) { return "人"; } } public class Plane:IFly { public string Say(string name) { Console.WriteLine("大飛機在天上飛啊"); return "飛翔著"; }
}
2.定義一個一接口IFly類型的數組實例化各個實現IFly接口的類
IFly[] ifly = { new Plane(), new Person() }; foreach (IFly item in ifly) { string name = item.Say("會飛的所有東西"); Console.WriteLine(name); }
3.接口也可以繼承接口
public interface IPlay:IFly { void Play(); }
二.接下來再說說讓我們編碼更方便的索引器吧!
1.屬性的本質是方法,索引器的本質是屬性。(可能會更好了解索引器)
2.索引器
01.C#中的類成員可以是任意類型,包括數組和集合。當一個類包含了數組和集合成員時,索引器將大大簡化對數組或集合成員的存取操作。
02.定義索引器的方式與定義屬性有些類似,其一般形式如下:
[修飾符] 數據類型 this[索引類型 index]
{
get{//獲得屬性的代碼}
set{ //設置屬性的代碼}
}
03.索引器的本質還可說是類(看源碼)
04.創建索引器代碼
public class Student { private string[] name = new string[2]; public string this[int index] { get { return name[index];} set { name[index]=value;} } } static void Main(string[] args) { #region 02.索引器 Student stu = new Student(); stu[0] = "董澤文"; stu[1] = "張一銘"; Console.WriteLine(stu[0] + "\n" + stu[1]); #region
三.你們都應該會特別感興趣的Foreach原理:
本質:實現了一個IEnumerable接口,
01.為什麼數組和集合可以使用foreach遍歷?
解析:因為數組和集合都實現了IEnumerable接口,該接口中只有一個方法,GetEnumerator()
02.數組是一種數據結構,它包含若干相同類型的變量。數組是使用類型聲明的:type[] arrayName;
03.數組類型是從抽象基類型 Array 派生的引用類型。由於此類型實現了 IEnumerable ,因此可以對 C# 中的所有數組使用 foreach 迭代。
04.面試題:
001.C#中能用foreach遍歷訪問的對象需要實現______接口或聲明______方法的類型。
解析:IEnumerable ,GetEnumerator()
05.實現IEnumerable接口的類MyConnection
public class MyConnection:IEnumerable { ArrayList list = new ArrayList(); public void AddList(object o) { list.Add(o); } public IEnumerator GetEnumerator() { return new MyIenumerator(list); } }
06.實現IEnumerator接口的類MyIEnumerator
public class MyIenumerator:IEnumerator { public ArrayList list = new ArrayList(); private int i = -1; public MyIenumerator(ArrayList mylist) { list = mylist; } public object Current { get { return list[i]; } } public bool MoveNext() { bool flag = false; if (i<list.Count-1) { i++; flag = true; } return flag; } public void Reset() { throw new NotImplementedException(); } }
07.實例化MyIEnumertor 即可用FOREACH來循環
MyConnection mycon = new MyConnection(); mycon.AddList("董澤文"); mycon.AddList("張一銘"); foreach (object item in mycon) { Console.WriteLine(item); }
四.匿名內部類
02.匿名類在底層還會被CLR編譯成一個有名字的類
03.匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,並且不能在源代碼級使用。 每個屬性的類型由編譯器推斷。
可通過使用 new 運算符和對象初始值創建匿名類型
#region 04.匿名內部類 var num = 1; var names= "1"; var falg= false; var stu =new {name="董澤文",age=12 }; if (num==1&&names.Equals("1")) { num++; names += "10"; falg = true; } Console.WriteLine(num + "\t" + names + "\t" + falg); Console.WriteLine(stu.name + "\t" + stu.age); #endregion
五.運算符重載
01.C# 允許用戶定義的類型通過使用 operator 關鍵字定義靜態成員函數來重載運算符。
02.重寫運算符方法的類
public class Personers { public string PName { get; set; } public int PAge { get; set; } //重寫了加法運算 public static int operator +(Personers p1,Personers p2) { return p1.PAge + p2.PAge; } //重寫了減法運算 public static int operator -(Personers p1, Personers p2) { return p1.PAge - p2.PAge; } //重寫了乘法運算 public static int operator *(Personers p1, Personers p2) { return p1.PAge * p2.PAge; } //重寫了除法運算 public static double operator /(Personers p1, Personers p2) { return p1.PAge / p2.PAge; } //重寫了恆等運算(必須與不等方法同時書寫) public static bool operator ==(Personers p1, Personers p2) { return p1.PAge == p2.PAge; } //重寫了不等運算(必須與恆等方法同時書寫)
public static bool operator !=(Personers p1, Personers p2) { return p1.PAge != p2.PAge; } }
03.實例化
Personers p1 = new Personers(); Personers p2 = new Personers(); p1.PAge = 25; p2.PAge = 12; Console.WriteLine(p1 + p2); Console.WriteLine(p1 - p2); Console.WriteLine(p1 * p2); Console.WriteLine(p1 / p2); Console.WriteLine(p1 == p2);
目前學習的內容就到這了,如果覺得對你有幫助的話,就請等待我的更新吧!如果有什麼知識點還不足的,請多多的提點建議!