C#中委托的理解及Action委托

本文详细介绍了C#中委托的概念,包括其定义、两种实例化方式以及Action委托的特性和使用示例,展示了如何通过委托封装和调用方法。
摘要由CSDN通过智能技术生成

一、委托的定义

C#中的委托类似于C++中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。

委托包含两部分,委托的声明和委托的实例化。

委托的声明示例如下:

public delegate string printString(string str);

二、委托的实现

委托的实例有两种方式,一种是通过new的方式创建,另一种方式是通过"+="注册的方式创建。

通过new创建实例的示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        public delegate string printString(string str);

        public string PrintOK(string str)
        {
            string newStr = str + " OK";
            return newStr;
        }

        public string PrintError(string str)
        {
            string newStr = str + " Error";
            return newStr;
        }

        public void printInfo(string str)
        {
            printString ps1 = new printString(PrintOK);
            printString ps2 = new printString(PrintError);

            Console.WriteLine(ps1(str));
            Console.WriteLine("---------------------");
            Console.WriteLine(ps2(str));
            Console.WriteLine("---------------------");
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.printInfo("hello");
           
            Console.ReadKey();
        }
    }
}

返回值如下:

hello OK
---------------------
hello Error
---------------------

通过"+="注册的方式创建实例的示例

说明:通过+=方式注册的函数都会被执行,但是假如delegate方法有返回值,则只返回最后一次注册的返回值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        public delegate int addNum(int i);
        public static int num = 0;

        public int addOne(int i)
        {
            num += 1;
            return i + 1;
        }

        public int addTwo(int i)
        {
            num += 2;
            return i + 2;
        }

        public int addNumResult(int i)
        {
            addNum an = null;
            an += addOne;
            an += addTwo;
            return an(i);
        }

        static void Main(string[] args)
        {
            Program p = new Program();

            int result = p.addNumResult(10);
            Console.WriteLine(result);
            Console.WriteLine(num);

            Console.ReadKey();
        }
    }
}

此时返回:

12(代表只返回最后一个注册函数的值)

3(代表所有的注册函数都执行了一遍)

三、Action委托

1、定义

Action委托是C#中的一个预定义委托类型,它表示一个不返回值的方法

Action委托可以用于封装一个方法,然后将其作为参数传递给另一个方法,或者将其赋值给一个委托变量,以便在需要时调用该方法。

Action委托的定义:

public delegate void Action();
public delegate void Action<in T>(T obj);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

2、使用示例

public void SayHello()
{
    Console.WriteLine("Hello!");
}

public void SayName(string name)
{
    Console.WriteLine("My name is " + name);
}

public void printString()
{
    Action helloAction = new Action(SayHello);
    Action<string> nameAction = new Action<string>(SayName);

    helloAction();
    nameAction("Hugh");
    nameAction.Invoke("Hugh2");
}

nameAction("Hugh")等价于nameAction.Invoke("Hugh"),

前者更简洁,但是编译后实际执行nameAction.Invoke方法。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值