---->了解委托。
生活中的例子:我要打官司,我需要找一个律师,法庭上面律师为当事人辩护,它真正执行的是当事人的陈词,这时律师 就相当于一个委托对象。当事人则委托律师为自己辩解。
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();