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

委托的练习:

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

    /// <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();
时间: 2024-10-11 02:52:10

30天C#基础巩固------了解委托,string练习的相关文章

30天C#基础巩固------this,base,string中的方法,StringBuilder性能

这里主要是记录下自己学习笔记,希望有个地方在以后可以看到自己走过的路. 关于之前多态的知识有一个口诀,很好理解里面的override和new,virtual关键字. "new则隐藏,over重写,隐藏看类型,重写只管新" 面向对象的三大特征:封装,继承,多态. 非面向对象的特征---静态 静态一般的是使用的是方法,很少有字段. 下面是修饰符的图片,关于修饰符这个要在项目中使用,慢慢的理解. 一:this和base的区别. 这两个都是在我们进行开发经常使用的,关于this代表类的本身,我

基础拾忆------委托详解

目录: 基础拾忆------委托详解 基础拾忆------接口详解 基础拾忆------泛型详解 前言: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托(Delegate)特别用于实现事件和回调方法.所有的委托都派生自 System.Delegate 类.把一个方法当作参数传递,让其它方法进行调用执行. 好比:今天中午不想出去,委托小明帮我带份饭,我要买饭,但是小明帮我买的. 1.委托的声明 委托声

Java基础----Java中的String和StringBuffer

String和StringBuffer String是一个特殊的对象,一旦被初始化,就不会被改变.()指的是abc 不是变量 s1. String s1="abc"; s1是一个类类型变量,"abc"是一个对象. String s2=new String("abc"); s1和s2的区别: s1在字符串常量池中创建了一个abc字符串 s2在堆中创建了两个对象一个是默认对象一个是字符串对象. ==和equals的区别 ==比较的是地址,equals

java基础复习之对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

String类型是实际工作中经常用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象可以用new创建,例如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其他类有些特殊,可以使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string"

C#基础加强篇—委托、Lambda表达式和事件(下)

3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的程序逻辑触发的.引发(触发)事件的对象叫做事件发送方,捕获事件并对其做出响应的对象叫做事件接收方. C#事件是按“发布——预定”的方式工作.先在一个类中公布事件,然后就可以在任意数量的类中对事件预定.在事件通信中,事件发送方类并不知道哪个对象或方法将接收到(处理)它所引发的事件.所需要的是在源和接收

30天C#基础巩固----Lambda表达式

     这几天有点不在状态,每一次自己很想认真的学习,写点东西的时候都会被各种小事情耽误,执行力太差.所以自己反思了下最近的学习情况,对于基础的知识,可以从书中和视频中学习到,自己还是需要注意下关于自己以前做的项目中的一些知识点,那些才是HR提问的关键所在.今天都6.4号了,时间过的真是快呀,学校7.18左右放假,自己打算去西安看看,能不能找到一个实习工作,不行的话只能等到大四的第一学期去走校招.可以我们大四的第一学期还有很多课,真不知道老师是如何想的.所以在这还剩不到快2个月的时间里,把自己

C++ 基础知识回顾(string基础、智能指针、迭代器、容器类)

[1] string基础 [1.1] string 的构造 1 #include <iostream> 2 #include <string> 3 4 int main() 5 { 6 using namespace std; 7 8 cout << "1 --- string(const char* s):将string对象初始化为s指向的C风格字符串" << endl; 9 string one("benxintuzi_1&

30天C#基础巩固----程序集,反射

一:认识程序集       只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集.那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly).       可以看做是一堆相关类打包的包,相当于java中的jar包(*);       程序集包含:类型元数据,程序集元数据,IL代码,资源文件       类型元数据:描述在代码中定义的每一类型和成员的二进制形式.       程序集元数据:程序集清单,版本号,名称等:       IL代码:被微软

C#基础加强篇---委托、Lamada表达式和事件(中)

2.Lamada表达式     C#共有两种匿名函数:匿名方法和Lamada表达式.在2.0之前的C#版本中,创建委托的唯一方法是使用命名方法.C#2.0中引入了匿名方法,匿名方法就是没有名称的方法.从C#3.0开始,就可以使用一种新语法把实现代码赋予委托——Lamada表达式. 在了解Lamada表达式之前,我们先来了解一下匿名方法.用匿名方法定义委托的语法与之前的没有区别,但在实例化时就有了一些区别. 使用命名方法创建的委托 1 class Program 2 { 3 private del