• 函数的重载

相对委托,是比较好理解的。

涉及一个概念:函数签名函数签名包括函数的名称和参数,而函数重载:就是使用相同的名称和不同的参数(参数类型、传递方式[传值或引用])来实现的。而不能声明相同的函数名称和参数,但是不同的返回类型,这样做并不是函数重载:因为函数签名没有包括其返回类型,所以这样做实际相当于重复定义函数,肯定会报错的。

        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( 即可得到提示信息,可发现参数有两种,只需要输入相符类型的参数即可:

            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),可实现同一个函数,不同的传值处理方式(被重载)。

  • 委托

在定义了委托后,就可以声明该委托类型的变量。接着,把这个变量初始为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像变量是一个函数一样。看个例子吧:

    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章介绍到与事件处理相关的内容时才更容易理解。

终于把这一篇比较重要的内容看完了,不过,没有系统化的做出案例,仍然不能说是掌握了。

01-C#入门(函数重载、委托)的更多相关文章

  1. 《挑战30天C++入门极限》新手入门:C++中的函数重载

        新手入门:C++中的函数重载 函数重载是用来iostream>  using namespace std;  int test(int a,int b);  float test(flo ...

  2. javascript 函数重载 overloading

    函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function over ...

  3. C#函数式程序设计之函数、委托和Lambda表达式

    C#函数式程序设计之函数.委托和Lambda表达式 C#函数式程序设计之函数.委托和Lambda表达式   相信很多人都听说过函数式编程,提到函数式程序设计,脑海里涌现出来更多的是Lisp.Haske ...

  4. C++命名空间、函数重载、缺省参数、内联函数、引用

    一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...

  5. 【C++】多态性(函数重载与虚函数)

    多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...

  6. Javascript函数重载,存在呢—还是存在呢?

    1.What's is 函数重载? );//Here is int 10 print("ten");//Here is string ten } 可以发现在C++中会根据参数的类型 ...

  7. C++函数重载和函数模板

    1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...

  8. JS魔法堂:函数重载 之 获取变量的数据类型

    Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...

  9. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

随机推荐

  1. VLOOKUP

    vlookup(查找目标,查找范围, 返回值的列数,精确或模糊查找) 1. 查找目标:查找的内容或者单元格引用. 2. 查找范围: 选定一个查找区域. 注意一: 查找目标一定要在该区域的第一列. 注意 ...

  2. c51跑马灯

    ORG 0000HMOV 20H, #0FFHMOV 21H, #0FDHMOV 22H, #0FBHMOV 23H, #0F7HMOV 24H, #0EFHMOV 25H, #0DFHMOV 26H ...

  3. 移动端的拖拽这个demo实现的功能

    SQL数据库适合那些需求确定和对数据完整性要去严格的项目.NoSQL数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因 ...

  4. Equls 和==的区别

    对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true.对于 string ...

  5. pyspider 简单应用之快速问医生药品抓取(一)

    网址:http://yp.120ask.com/search/-0-0--0-0-0-0.html from pyspider.libs.base_handler import * class Han ...

  6. (转)如何进行Monkey Test

    如何进行Monkey Test   目录 一 简介 二 测试准备 三 基本命令格式 四 测试Log获取 五 Monkey命令参数介绍 六 保存monkey log以及手机log到sdcard(新增) ...

  7. 如何用css3实现一个图片的抖动或者弹跳

    <li onmouseout="this.className='off'"><a href=""><img src=". ...

  8. Quartz conTrigger 定时器表达式大全

    CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , ...

  9. SQL SERVER 简介及应用 - 数据库系统原理

    SQL SERVER 是一个分布式的关系型数据库管理系统(RDBMS),具有客户 - 服务器体系结构,一般发行的版本有企业版.标准版.个人版.开发版. SQL SERVER 提供的服务 MS SQL ...

  10. 控制器(Controller) – ASP.NET MVC 4 系列

           创建一个 ASP.NET MVC 4 Web Application 项目,将程序命名为 MvcMusicStore,如下图: 控制器        MVC 模式中,控制器主要负责响应用 ...