01-C#入门(函数重载、委托)
- 函数的重载
相对委托,是比较好理解的。
涉及一个概念:函数签名。函数签名包括函数的名称和参数,而函数重载:就是使用相同的名称和不同的参数(参数类型、传递方式[传值或引用])来实现的。而不能声明相同的函数名称和参数,但是不同的返回类型,这样做并不是函数重载:因为函数签名没有包括其返回类型,所以这样做实际相当于重复定义函数,肯定会报错的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static int MaxVal( int [] intArrayVal) { int maxVal = intArrayVal[0]; for ( int i = 0; i < intArrayVal.Length; i++) { if (intArrayVal[i] > maxVal) { maxVal = intArrayVal[i]; } } return maxVal; } static double MaxVal( double [] doubleArrayVal) { double maxVal = doubleArrayVal[0]; for ( int i = 0; i < doubleArrayVal.Length; i++) { if (doubleArrayVal[i] > maxVal) { maxVal = doubleArrayVal[i]; } } return maxVal; } |
声明两个函数的版本(同名),在使用时,输入函数名:MaxVal( 即可得到提示信息,可发现参数有两种,只需要输入相符类型的参数即可:
1 2 3 4 | int [] myInt = { 1, 3, 4, 5 }; double [] myDouble = { 3.14, 3.15, 3.22, 3.01, 2.14 }; Console.WriteLine( "myInt 最大值是 {0}" , MaxVal(myInt)); Console.WriteLine( "myDouble max value is: {0}" , MaxVal(myDouble)); |
当然,重载还包括不同的参数类型(比如ref),可实现同一个函数,不同的传值处理方式(被重载)。
- 委托
在定义了委托后,就可以声明该委托类型的变量。接着,把这个变量初始为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像变量是一个函数一样。看个例子吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | class Program { //定义委托:之后可声明委托类型的变量; //初始化委托变量:可以初始化该变量为函数的引用,在初始化时需指定对应的函数名; //对这些函数有个要求:必须是返回类型、参数列表与委托相同的; //使用委托变量:在使用该委托变量时,用法和函数一样(包括返回值); //思考?如果不用委托,判断用户输入,再调用对应的函数,一样可以达到效果…… //错,重点是:可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。 delegate double ProcessDelegate( double param1, double param2); static double Multiply( double param1, double param2) { return param1 * param2; } static double Divide( double param1, double param2) { return param1 / param2; } static void Main( string [] args) { ProcessDelegate process; Console.WriteLine( "请输入两个数,用逗号隔开:" ); string input = Console.ReadLine(); int commaPos = input.IndexOf( ',' ); //声明初始化两个double值,从上面获取的数中转换,用commaPos来判断值的内容 double param1 = Convert.ToDouble(input.Substring(0,commaPos)); double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1)); Console.WriteLine( "输入 M 执行 相乘 或者输入 D 执行 相除 操作:" ); input = Console.ReadLine(); if (input == "m" ) //初始化委托变量,指定委托类型(上面建的ProcessDelegate),并提供一个引用函数的参数, //这是委托赋值的一种语法,在括号中,指定相应的函数名(不带括号); //还有简单的用法,process = Multiply; //编译器会自动匹配委托变量与函数的返回类型和参数,不匹配,应该会报错; process = new ProcessDelegate(Multiply); else process = new ProcessDelegate(Divide); Console.WriteLine( "根据你的选择,委托在实例化的时候,调用不同的函数;" ); Console.WriteLine( "并且,在这一步传递对应的参数给委托(委托交给函数),计算的结果:{0}" , process(param1, param2)); Console.ReadKey(); } } |
重点是:可以把委托变量作为参数传递给一个函数,这样,这个函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。
- 结语
之前看同事演示过项目中运用到的委托机制,虽然这儿把原理搞清楚了,但是深入的使用仍然很模糊,不过据说要等到13章介绍到与事件处理相关的内容时才更容易理解。
终于把这一篇比较重要的内容看完了,不过,没有系统化的做出案例,仍然不能说是掌握了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库