30天C#基础巩固------了解委托,string练习

简介: 30天C#基础巩固------了解委托,string练习

---->了解委托。


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


   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);
    }
}


679140-20160526194737522-923524857.png


委托的练习:


   实现一个打招呼的方法,但是每个国家的是不一样的,我们需要使用委托来实现。


/// <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);
    }
}



679140-20160526194740038-2049171293.png


注意我们这个练习和上面的区别,我们上面是直接按照步骤,每一步都没有省略,这里我们只是实例化了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();



679140-20160526194741647-1886418411.png


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();



 




目录
相关文章
|
4月前
|
C#
51.c#:string类的静态方法
51.c#:string类的静态方法
160 1
|
26天前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
38 4
|
26天前
|
C#
C#中的委托(一)
C#中的委托(一)
27 1
|
12天前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
28 0
|
4月前
|
存储 安全 C#
C# - 委托与事件
这篇文档介绍了C#中的委托和事件。委托是存储方法引用的类型,支持回调、事件处理,具有引用方法、类型安全、多播性等特性,并在异步编程中发挥作用。事件是委托的封装,提供保护和订阅机制,防止外部直接访问。当需要在类内部控制方法调用,防止外部误触发时,可使用事件。
|
3月前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
4月前
|
C#
c#委托详解
c#委托详解
27 0
|
4月前
|
自然语言处理 C# 数据安全/隐私保护
50.c#:string类初始化
50.c#:string类初始化
196 1
|
4月前
|
开发框架 .NET C#
C# Dictionary<string, string> 对key做筛选
C# Dictionary<string, string> 对key做筛选
54 2