C#.Net 委托
2021/9/22 9:10:39
本文主要是介绍C#.Net 委托,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
委托复习
- 委托是一种数据类型,像类一样的一种数据类型。一般都是直接在命名空间中定义。
- 定义委托时,需要指明返回值类型、委托名与参数列表,这样就能确定该类型的委托能存储什么样的方法。
- 使用委托:
- 声明委托变量。
- 委托是一个引用类型,就像类一样,所以当声明委托变量后,如果不赋值则该委托变量为
null
。所以在使用委托变量前最好做非空校验weituo!=null
。 - 委托类型的变量只能赋值一个委托类型的对象。
委托,像 C++ 的函数指针。
static void Main() { MyDelegate md = new MyDelegate(M1); md(); MyDelegate md1 = M1; // 这种定义的方法是 // 和上面是一样的,省略了 new。 md1.Invoke(); // 这种调用的方法是上面写法的完整版。 // Invoke(/*有参数的话可以在括号中传递。*/) } static void M1() { Console.WriteLine("M1 函数。"); } public delegate void MyDelegate();
输出:
我是 M1 函数 我是 M1 函数 请按任意键继续.
委托在什么情况下用
public class MyClass { public void Say() { /* ...... 这里是要执行的代码,而这段代码的不确定性很大。根据调用者的不同可能执行的 代码不一样。这时候就可以把这段代码封装起来,封装成一个委托类型。通过委托 变量来代替,将来你传递一个什么委托变量,这个地方就执行什么方法。 这样的意思,代码提前写好了,在这个地方先占一个位,这里执行的代码是活的。 是由传递过来的方法确定的。 ......*/ } }
委托就是事先占了一个位置,执行的方法待定,由传递过来的方法决定,较的灵活。
实例练习
练习3: // 把邮箱名替换成※号 zxh@itcast.cn → ***@itcast.cn steve_zhao@163.com → **********@163.com sk@codeedu.com → **@codeedu.com
static void Main() { while(true) { Console.WriteLine("请输入一个邮箱地址:"); string email = Console.ReadLine(); email = Regex.Replace(email, @"(\w+)(@\w+\.\w)", ReplaceMethod, RegexOptions.ECMAScript); // ▲ 第三个参数直接传递一个返回值为 string 类型的方法, // 这里就用的委托,不是定死的,是活的。 Console.WriteLine(email); } } static string ReplaceMethod(Match match) { string uid = match.Groups[1].Value; string others = match.Groups[2].Value; StringBuilder sb = new StringBuilder(); for (int i = 0; i < uid.Length; i++) { sb.Append("*"); } return sb.ToString() + others; }
委托的使用
- 声明委托的方式:
delegate
返回值类型 委托类型名(参数) 比如delegate void StringProcess(string s);
注意这里的除了前面的delegate
,剩下部分和声明一个函数一样,但是StringProcess
不是函数名,而是委托类型名。 - 存储什么样的方法就声明什么类型(方法参数与返回值)的委托。
- 声明的委托是一种类型,就像
int
、Person
一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcess f1;
- 将委托类型变量指向函数
StringProcess sp = new StringProcess(SayHello)
,这样就可以像调用普通函蒙一样把sp
当成函教用了.委托可以看做是函数的指针.整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它.和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。 - 将委托类型变量指向函数还可以简化成
StringProcess sp = SayHelo
,编译器帮我们进行了new
.但是不能sp = Printit()
,因为这样就成了函数调用。
参考:
1.link-01 // C#.Net基础加强十一天-委托 事件 反射
这篇关于C#.Net 委托的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#