zoukankan      html  css  js  c++  java
  • 委托,文件流,扩展方法学习笔记

    1. 委托使用

      (1) 什么是委托?(安全的函数指针)

        通俗:就是一个能存放符合某种格式(方法签名)的方法的指针的清单

      (2) 定义委托

           public delegate int AddDel(int a,int b);

      (3) 静态委托方法的实现,一个简单的加法实现

       namespace DelegateDemo
    
      {
    
                //约束的指向方法的签名,也就是一个强类型的指针
    
                public  delegate int AddDel(int a,int b);
    
                class Program
    
                {
    
                       static void Main(string[] args)
    
                       {
    
                              //定义一个委托的变量,注意指向第一个方法的时候一定要用new,后面就可以使用+=了
    
                              AddDel del = new AddDel(AddFunc);  //指向一个方法
    
                              //使用委托
    
                              Console.WriteLine(del(2, 3));
    
                              Console.ReadKey();
    
                       }
    
                       static int AddFunc(int a, int b)
    
                       {
    
                              return a + b;
    
                       }
    
                }
    
         }

      (4) 实例委托方法的实现

     namespace DelegateDemo
    
         {
    
                  //约束的指向方法的签名,也就是一个强类型的指针
    
                public  delegate int AddDel(int a,int b);
    
                class Program
    
                {
    
                       static void Main(string[] args)
    
                       {
    
                              //实例方法
    
                              Program p = new Program();
    
                                AddDel del = new AddDel(p.AddInstence);
    
                              Console.WriteLine(del(2, 3));
    
                              Console.ReadKey();
    
                       }
    
                       //实例方法
    
                         public int AddInstence(int a, int b)
    
                       {
    
                              return a + b;
    
                       }
    
                }
    
         }

      (5) 可以将这段代码放到Reflect中查看以下,你会发现一些特性的

      (6) 委托的使用:匿名方法

        1)如果在程序中方法非常简单,并且不怎么重复使用,这就考虑做成匿名方法

           2)匿名方法:第一必须有delegate关键字,后面紧跟方法参数的签名,后面是方法体

            namespace DelegateDemo
    
                {
    
                       //约束的指向方法的签名,也就是一个强类型的指针
    
                       public  delegate int AddDel(int a,int b);
    
                       class Program
    
                       {
    
                              static void Main(string[] args)
    
                              {
    
                                     //匿名方法
    
                                     //如果在程序中方法非常简单,并且不怎么重复使用,这就考虑做成匿名方法
    
                                     AddDel delNoName = delegate(int a, int b) { return a + b; };
    
                                     Console.WriteLine(delNoName(2, 3));
    
                                     Console.ReadKey();
    
                              }
    
                       }
    
                }

      (7) Lambda表达式继续简化

        1) => Lambda的标记,前面是方法参数的签名,后面是方法体

                 namespace DelegateDemo
    
                  {
    
                         //约束的指向方法的签名,也就是一个强类型的指针
    
                         public  delegate int AddDel(int a,int b);
    
                         class Program
    
                         {
    
                                static void Main(string[] args)
    
                                {
    
                                       //匿Lambda
    
                                       //第一种写法
    
                                       AddDel delLambda = (int a, int b) => { return a + b; };
    
                                       //第二种类型
    
                                       AddDel delLambda1 = (a, b) => { return a + b; };
    
                                       //第三种写法
    
                                       //如果方法体里面只有一行代码,那么Lambda就会自动将表达式的值直接返回回去
    
                                       //Lambda方法的参数的类型可以省略,因为在委托中已经定义了,方法的签名的格式,所以在编译的时候会自动推断Lambda里面的类型
    
                                       //Lambda本质就是匿名函数,由匿名函数发展而来
    
                                       AddDel delLambda2 = (a, b) => a + b;
    
                                       Console.WriteLine(delLambda(2, 3));
    
                                       Console.ReadKey();
    
                                }
    
                         }
    
                  }

    2.扩展方法

      (1) this:关键字是对那个类型进行扩展,必须指定一个类型,在使用扩展方法的时候,this指定的参数不用传递参数

      (2)在一个控制台项目中新建一个类ListExt.cs,代码如下:

    public static class ListExt
    
         {
    
                //把查询结果是否符合我们要求的逻辑抽象到了一个del委托里面去
    
                public static List<string> MyFindAll(this List<string> list, Predicate<string> del)
    
                {
    
                       //遍历List集合中得的每一个元素,并调用del委托执行,看此方法返回的参数true的话放到一个结果集合众
    
                       List<string> resultList = new List<string>();
    
                       //遍历原始的集合
    
                       foreach (var item in list)
    
                       {
    
                              //调用传递过来的委托校验元素是否符合我们需要的元素
    
                              bool isOk = del(item);
    
                              if (isOk)
    
                              {
    
                                     resultList.Add(item);
    
                              }
    
                       }
    
                       return resultList;
    
                }
    
         }

         (3)在Main方法中的代码是:

              namespace DelegateDemo
    
                {
    
                       public  delegate int AddDel(int a,int b);
    
                       class Program
    
                       {
    
                              static void Main(string[] args)
    
                              {
    
                                     //传递委托
    
                                     List<string> list = new List<string>() { "5", "1", "13", "8", "9" };
    
                                     //隐式推断类型
    
                                     //var result = list.MyFindAll(s => string.Compare(s, "3") >= 0);
    
                                     //Predicate<string> 类型实例
    
                                     var result = list.MyFindAll(IsStrok);
    
                                     foreach (var item in result)
    
                                     {
    
                                            Console.WriteLine(item);
    
                                     }
    
                                     Console.ReadKey();
    
                              }
    
                              static bool IsStrok(string s)
    
                              {
    
                                     return string.Compare(s, "3") >= 0;
    
                              }
    
                       }
    
                }

    3. 泛型委托

      (1) Reflect中查看Func方法:public delegate TResult Func<in T, out TResult>(T arg);,带两个参数的

           1)封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。

           2)arg: 此委托封装的方法的参数。

           3)T: 此委托封装的方法的参数类型。

           4)TResult: 此委托封装的方法的返回值类型。

    class Program
    
         {
    
                static void Main(string[] args)
    
                {
    
                       Func<string, bool, bool> funcDemo = new Func<string, bool, bool>(FuncD);
    
                }
    
                static bool FuncD(string s, bool b)
    
                {
    
                       return true;
    
                }
    
         }

      (2)Reflect中查看Action方法:ublic delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

           1)封装一个方法,该方法具有两个参数并且不返回值。

           2)arg1:此委托封装的方法的第一个参数。

         3)arg2:此委托封装的方法的第二个参数。

         4)T1: 此委托封装的方法的第一个参数类型。

         5)T2:此委托封装的方法的第二个参数类型。

    4. FileStream文件流

      (1) FileStream对象表示在磁盘或者网络路径上执行文件的流

      (2) 使用FileStream类对文件系统上的文件进行读取,写入,打开和关闭操作

      (3) FileStream对输入输出进行缓冲,从而提高性能

      (4) 为什么不使用File.ReadAllText()?好处之一就是:对于大文件来说,FIleStream可以对文件采取分段读取,即每次只读到一部分到内存里面

      (5) 字符串和字节数组的转换

           1)字节数组转换成字符串:String

                  System.Text.Encoding.UTF8.GetString(byte[])

           2)字符串转换成字节数组:byte[]

                  System.Text.Encoding.UTF8.GetButes(String)

      (6)文件读写的案例代码:只作为参考,可自行研究

    public partial class frmMain : Form
    
         {
    
                public frmMain()
    
                {
    
                       InitializeComponent();
    
                }
    
                private void btnCheckFile_Click(object sender, EventArgs e)
    
                {
    
                       using (OpenFileDialog ofd = new OpenFileDialog())
    
                       {
    
                              //设定文件流要读取那个类型
    
                              //ofd.Filter = "*.txt|(*.txt)|(*.doc)|(*.doc)";
    
                              if (ofd.ShowDialog() == DialogResult.OK)
    
                              {
    
                                     txtFileName.Text = ofd.FileName;
    
                              }
    
                       }
    
                }
    
                private void btnReadFile_Click(object sender, EventArgs e)
    
                {
    
                       if (txtFileName.Text == "")
    
                       {
    
                              MessageBox.Show("请您选择文件信息");
    
                              return;
    
                       }
    
                       using (FileStream fsRead = new FileStream(txtFileName.Text, FileMode.OpenOrCreate, FileAccess.Read))
    
                       {
    
                              using (StreamReader reader = new StreamReader(fsRead, Encoding.Default))
    
                              {
    
                                     while (!reader.EndOfStream)
    
                                     {
    
                                            string str = reader.ReadLine() + "\r\n";
    
                                            this.rtbFileContent.AppendText(str);
    
                                     }
    
                              }
    
                       }
    
                }
    
                private void btnSave_Click(object sender, EventArgs e)
    
                {
    
                       if (rtbWriteFile.Text == "")
    
                       {
    
                              MessageBox.Show("请您填写要写入文档的内容");
    
                              return;
    
                       }
    
                       using (SaveFileDialog sfd = new SaveFileDialog())
    
                       {
    
                              if (sfd.ShowDialog() == DialogResult.OK)
    
                              {
    
                                     using (StreamWriter writer = new StreamWriter(sfd.FileName))
    
                                     {
    
                                            writer.Write(this.rtbWriteFile.Text);
    
                                            //将内存中的数据写入到磁盘中
    
                                            writer.Flush();
    
                                     }
    
                              }
    
                       }
    
                       MessageBox.Show("文件写入成功,请您检查");
    
                }
    
                private void btnClose_Click(object sender, EventArgs e)
    
                {
    
                       this.Close();
    
                }
    
           }
  • 相关阅读:
    15--k8s之安全认证
    14--k8s之StorageClass,ConfigMap,Secret
    13--基本存储、高级存储、存储配置
    10--k8s之数据持久化
    9--k8s之Endpoints、健康服务检查、高可用
    8--k8s之service和ingress详解
    7--k8s之Pod控制器详解
    6--k8s之Pod结构、配置、生命周期、调度
    索引原理和慢查询优化
    pymysql模块及sql注入
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/2734786.html
Copyright © 2011-2022 走看看