委托,文件流,扩展方法学习笔记
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(); } }
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利