C#学习笔记7_函数重载_事件与委托_函数回调

一、函数重载

函数的重载指的是在一个类中,有相同的名字的函数,但是函数参数不同的函数。函数的实现内容不要求一样。

注意:仅仅有返回类型不同的情况,都不是重载函数。

public int Add(int a,int b,int c)
{
}
public int Add(int a,int b)
{
}
public void Add(double a)
{
}
二、函数委托

委托(delegate)是一种可以把引用存储为函数的类型。委托的声明非常类似于函数,但不带函数体,且要使用delegate 关键字。

委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。

C#的委托(Delegate)类似c或者c++的函数指针,但是,委托是类型安全和可靠的。委托也是事件的基础。**一旦为委托分配了方法,委托将与该方法具有完全相同的行为。**与委托签名匹配的任何方法都可以分配给当前委托。

声明委托(Delegate)
//有参数有返回值
public delegate int CalcDelegate(int a,int b);
//实例化委托
CalcDelegate calc = new CalcDelegate(Add);
//或者
CalcDelegate calc = Add;

public int Add(int a,int c)
{
	return a+c;
}

例子1:传递方法

using System;
delegate int CalcDelegate(int n, int b);
namespace DelegateApp1
{
    class TestDelegate1
    {
        public int Add(int p, int c)
        {
            return p + c;
        }

        public int Mult(int q, int c,int g)
        {
            return q * c * g;
        }

    }

    class TestDelegate
    {
        public static int Add(int p, int c)
        {
           return p + c;
        }

        public static int Mult(int q,int c)
        {
            return q * c;
        }

        private static int Othe(int v, int h)
        {
            return v - h;
        }

        static void Main(string[] args)
        {
            //创建委托实例
            CalcDelegate cd1 = new CalcDelegate(Add);
            CalcDelegate cd2 = new CalcDelegate(Mult);

            //使用委托对象调用方法
            int result1 = cd1(12, 22);
            Console.WriteLine("Value of Num: {0}", result1);
            int result2 = cd2(5, 6);
            Console.WriteLine("Value of Num: {0}", result2);

            //在一个类中直接使用方法,不用实例化
            int result3 = Add(1, 2);


            //类实例
            TestDelegate1 cd3 = new TestDelegate1();
            int result4 = cd3.Add(1,2);
            Console.WriteLine("Value of Num: {0}", result4);
            int result5 = cd3.Mult(1, 2, 3);
            Console.WriteLine("Value of Num: {0}", result5);

            Console.ReadLine();

        }
    }
}

例子2:为什么用委托

例如我们要实现一个打招呼的方法,而每个国家打招呼的方式都不一样,刚开始我们可能会像下面这样实现打招呼的方法:

        public void Greeting(string name,string language)
        {
            switch (language)
            {
                case "zh-cn":
                    ChineseGreeting(name);
                    break;
                case "en-us":
                    EnglishGreeting(name);
                    break;
                default:
                    EnglishGreeting(name);
                    break;
            }
        }

        public void EnglishGreeting(string name )
        {
            Console.WriteLine("Hello, " + name);
        }

        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好, " + name);
        }

若后续我们需要添加德国、日本等打招呼方法,就必须修改Greeting方法内的case语句,来适应新的需求,这样特别不方便。有了委托,我们就可以把函数作为参数,并像如下代码实现Greeting方法:

class Program
    {
        public delegate void GreetingDelegate(string name);
//GreetingDelegate该委托传递的是方法
        static void Main(string[] args)
        {
            //引入委托
            Program p = new Program();

            p.Greeting("小叶", p.ChineseGreeting);

            p.Greeting("Tommy Li", p.EnglishGreeting);

            Console.Read();

        }

        public void Greeting(string name, GreetingDelegate callback)
        {
            callback(name);
        }
        public void EnglishGreeting(string name)
        {
            Console.WriteLine("Hello, " + name);
        }

        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好, " + name);
        }


    }

实例3:委托可以多播,用+=来添加到调用列表,-=来移除调用列表。

 static void Main(string[] args)
      {
         // 创建委托实例
         CalcDelegate  cd=null;
         CalcDelegate cd1 = new CalcDelegate(Add);
         CalcDelegate cd2 = new CalcDelegate(Mult);
        cd+=cd1;
        cd+=cd2;
        Console.Writeline("num:{0}",cd(5,6));
         Console.ReadKey();
      }

委托实例4:函数回调
最常见的回调应用之一,是计时器到点时调用的函数。涉及到的类型(.NET有三个计时器类型,这个是线程名称空间System.Threading里的Timer):

public sealed Timer(TimerCallBack callback, object state, int dueTime, int period)public delegate void TimeCallBack(object state);

Timer类型中,callback是一个委托TimerCallBack的对象;state是调用时的状态参数,可以灵活应用;dueTime是计时器开始计时的等待时间;period是计时周期,每完成一个周期就调用方法callback
2.
回调函数CalllBack的委托定义表明,计时器类Timer到点时回调的函数不能有返回类型,但必须有一个参数object型的参数。注意,此处委托的所谓逆变不能用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,委托事件都是用于实现回调函数的机制。委托是一种类型,它可以存储对一个或多个方法的引用,而事件则是委托的一种特殊用法,它只能用于触发事件时调用方法。 回调函数是一种编程模式,它允许我们将一个函数作为参数传递给另一个函数,并在需要时调用该函数回调函数通常用于异步编程中,例如在网络编程中,当数据到达时,我们可以使用回调函数来处理数据。 委托事件都可以用于实现回调函数的机制。委托可以将一个方法作为参数传递给另一个方法,并在需要时调用该方法。事件则是一种特殊的委托,它只能用于触发事件时调用方法。 使用回调函数的步骤如下: 1. 定义一个委托类型,该委托类型定义了回调函数的签名。 2. 在需要使用回调函数的方法中,将该委托类型的实例作为参数传递给另一个方法。 3. 在另一个方法中,将该委托类型的实例保存下来,并在需要时调用该委托实例。 下面是一个简单的示例代码: ``` // 定义一个委托类型 delegate void MyCallback(int result); class MyClass { // 定义一个方法,该方法接受一个回调函数作为参数 public void DoSomethingAsync(int arg, MyCallback callback) { // 异步执行一些操作 int result = arg * 2; // 调用回调函数 callback(result); } } class Program { static void Main(string[] args) { MyClass obj = new MyClass(); // 创建一个委托实例,该委托实例引用了一个方法 MyCallback callback = new MyCallback(MyCallbackFunction); // 调用DoSomethingAsync方法,并传递委托实例作为回调函数 obj.DoSomethingAsync(10, callback); } // 定义一个回调函数 static void MyCallbackFunction(int result) { Console.WriteLine("Result: " + result); } } ``` 在上面的示例代码中,我们定义了一个委托类型`MyCallback`,它定义了一个接受一个整数参数的回调函数。然后我们定义了一个类`MyClass`,它有一个方法`DoSomethingAsync`,该方法接受一个整数参数和一个回调函数作为参数。在`DoSomethingAsync`方法中,我们异步执行一些操作,并在完成后调用回调函数。在`Main`方法中,我们创建了一个委托实例,并将其作为回调函数传递给`DoSomethingAsync`方法。最后,在回调函数`MyCallbackFunction`中,我们输出了结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值