標籤:
---->瞭解委託。
生活中的例子:我要打官司,我需要找一個律師,法庭上面律師為當事人辯護,它真正執行的是當事人的陳詞,這時律師 就相當於一個委派物件。當事人則委託律師為自己辯解。
C#中的委託是一個類,(類類型),因為只有類才有對象的概念。C#中的委託可以理解為函數的一個封裝,它使得C#中的函數可以作為參數來傳遞。
委託的定義:
//定義委託 public delegate void MyDelegate(int para1,string para2);
委託的一些步奏:
1:定義委託類型,(方法類似於方法的申明)
public delegate void MyDelegate(int para1,int para2);
2:申明委託,既然委託是一種類型,可以利用委託來聲明一個委託變數。
MyDelegate d;
3:執行個體化委託,並且 傳遞參數(方法)進去。
d=new MyDelegate(new Program().Add);
4:委託類型作為參數傳遞給另一個方法。
MyMethod(d);
5:在方法中調用委託。
private static void MyMethod(MyDelegate myDelegate) { //5:在方法中調用委託 myDelegate(1,2); }
委託的注意事項:
1:定義委託只能使用delegate關鍵字,執行個體化委託是用一個方法名(不帶括弧)作為參數,並且這個方法的定義符合委託的定義,也就是該方法的傳回值類型 ,參數個數,類型必須和委託定義中的一樣。
2:委託可以把一個方法作為另一個方法的參數,可以看作是一個封裝方法的對象。它的調用和方法的調用一樣,傳遞參數類型和個數必須與委託定義一致。
委託我現在的理解就是把方法當作參數進行傳遞。下面的圖片最後面的方法裡面的求和就是調用前面Add()方法來進行。
/// <summary> /// 委託的學習 /// </summary> class Program { //1:使用delegate來定義委託 public delegate void MyDelegate(int para1,int para2); static void Main(string[] args) { //2:申明委託 MyDelegate d; //3:執行個體化委託,傳遞一個方法(執行個體化之後的方法), d=new MyDelegate(new Program().Add); //4:委託類型作為參數傳遞給另一個方法。 MyMethod(d); //d這裡就相當於方法Add一樣,我們傳遞到了MyMethod()方法中。 } //這個方法定義必須和委託定義相同,即傳回型別為void,兩個參數為int. private void Add(int para1,int para2) { int sum = para1 + para2; Console.WriteLine("兩個數的和為:"+sum); Console.ReadKey(); } //方法的參數是委託類型。 private static void MyMethod(MyDelegate myDelegate) { //5:在方法中調用委託 myDelegate(1,2); } }
委託的練習:
實現一個打招呼的方法,但是每個國家的是不一樣的,我們需要使用委託來實現。
/// <summary> /// 委託執行個體 /// </summary> class Program { public delegate void GreetingDelegate(string name); //定義委託,一個參數。 static void Main(string[] args) { //引入委託 //這裡總感覺不是聲明執行個體化委託,只像是執行個體化了一個Program,注意這裡執行個體化Program的同時,其實也就是把GreetingDelegate執行個體化了。 Program p=new Program(); p.Greeting("阿輝",p.ChineseGreeting); //委託的方法,這裡的參數是我們的每個國家的方法。 p.Greeting("張輝",p.EnglishGreeting); Console.ReadKey(); } /// <summary> /// 把委託作為參數,在方法裡面調用傳遞的方法。 /// </summary> /// <param name="name"></param> /// <param name="callback"></param> public void Greeting(string name,GreetingDelegate callback) { //調用委託 callback(name); } //英國人 public void EnglishGreeting(string name) { Console.WriteLine("Hello,"+name); } //中國人 public void ChineseGreeting(string name) { Console.WriteLine("你好,"+name); } }
注意我們這個練習和上面的區別,我們上面是直接按照步驟,每一步都沒有省略,這裡我們只是執行個體化了Program,我們上面的例子可以簡寫成這樣。
static void Main(string[] args) { ////2:申明委託 //MyDelegate d; ////3:執行個體化委託,傳遞一個方法(執行個體化之後的方法), //d=new MyDelegate(new Program().Add); ////4:委託類型作為參數傳遞給另一個方法。 //MyMethod(d); //d這裡就相當於方法Add一樣,我們傳遞到了MyMethod()方法中。 Program d=new Program(); MyMethod(d.Add); }
關於字串等的練習。
eg--01: 123-456--7--89-----123-----2,把類似的字串中重複符號-去掉。返回123-456-7-89-123-2的形式。
string str = "123-456--7--89-----123-----2"; string[] stsr = str.Split("-".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); //先將字串劃分為字元數組,把其中的"-"去掉 str=string.Join("-",stsr); //利用Join把字元數組中的每一項通過"-"串連起來。 Console.WriteLine(str); Console.ReadKey();
eg—02:從檔案路徑中提取出檔案名稱(包括尾碼),比如:C:/A/B.txt中提取出B.txt這個檔案名稱。
string str = "C:/A/B.txt"; //我們通過File得到的路徑都是字串。 string path = Path.GetFileName(str); Console.WriteLine(path); Console.ReadKey();
eg—03: "192.168.10.5[Port=21,type=ftp]",請用程式解析此字串,列印"IP地址為,,,連接埠為,,,提供服務。。。"
方法1:
string str = "192.168.10.5[Port=21,type=ftp]"; int a = str.IndexOf(‘=‘); //擷取到位元組‘=‘的地址 string port = str.Substring(++a, 2);//截取後面的資料 int b = str.IndexOf(‘[‘); string ip = str.Substring(0, b); int c = str.IndexOf(‘e‘); string type = str.Substring(c + 2, 3); Console.WriteLine(ip); Console.WriteLine(port); Console.WriteLine(type); Console.WriteLine("IP地址是{0},連接埠號碼是{1},提供的服務是{2}",ip,port,type); Console.ReadKey();
方法2:
string s1 = "192.168.1.5[Port=21,Type=ftp]"; string s2 = "192.168.10.5[Port=21]"; //首先是IP string[] temps = s1.Split("[]".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); string ip = temps[0]; //下面取出來的是索引值對。 string[] subTemps = temps[1].Split(‘,‘); Dictionary<string ,string> dic=new Dictionary<string, string>(); for (int i = 0; i <subTemps.Length; i++) { string[] ss = subTemps[i].Split(‘=‘); dic.Add(ss[0],ss[1]); //把鍵和值放到了集合中。 } dic.Add("IP",temps[0]); if(!dic.ContainsKey("Type")) { dic.Add("Type","fttp"); } //迴圈輸出集合中的鍵和值 foreach (KeyValuePair<string, string> item in dic) { Console.WriteLine(item.Key+": "+item.Value); } Console.ReadKey();
30天C#基礎鞏固------瞭解委託,string練習