浅谈C#中Action和Func回调的常用方式

目录
  • 一、简介
  • 二、Action
    • 例1
    • 例2
  • 三、Func
    • 例1
    • 例2
  • 结束

一、简介

Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性。基本涵盖了所有常用的委托,所以一般不用用户重新声明。Action系列泛型委托,是没有返回参数的委托,最多可以有16参数,也可以没有参数。

Func系列的委托是有返回值的委托,最多可以有16个参数;元组是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本。元组使用泛型来简化一个类的定义.提供用于创造元组对象的静态方法。最多可以提供创建新的 8 元组,即八元组。

二、Action

委托其实就是把方法当作参数来调用,Action就是其中之一,Action 作为参数不能有返回值,参数可以是任意类型,也可以不传递参数。

例1

调用某个类中的Action

using System;

namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.myAction();

            Console.ReadKey();
        }
    }

    public class Test1
    {
        public Action myAction = null;

        private void sayHi()
        {
            Console.WriteLine("fuck you!");
        }

        public Test1()
        {
            myAction = sayHi;
        }
    }
}

运行:

这种方式用的比较少,Action常用的方式通常是用来作为和回调

例2

执行一系列的操作后,再执行回调,也是比较推荐的使用方式。

using System;

namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.Calculation(1, 2, ReceiveResult);

            Console.ReadKey();
        }

        private static void ReceiveResult(int res)
        {
            Console.WriteLine("结算的结果是:" + res);
        }
    }

    public class Test1
    {
        public void Calculation(int x, int y, Action<int> call)
        {
            if (call != null)
            {
                call(x + y);
            }
        }
    }
}

运行:

将方法换成 Lambda 表达式,效果一样的,关于Lambda的使用方法,可以参考:点击跳转

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

namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            test1.Calculation(1, 2, (int res) =>
            {
                Console.WriteLine("结算的结果是:" + res);
            });

            Console.ReadKey();
        }
    }

    public class Test1
    {
        public void Calculation(int x, int y, Action<int> call)
        {
            if (call != null)
            {
                call(x + y);
            }
        }
    }
}

三、Func

上面使用Action的案例中,执行回调后,都没有返回值,这是因为Action并不能接收返回值,如果想执行回调,又有返回值怎么办呢,Func就是用来解决这个问题的。

Func 必须有一个返回值,否则会报错,如下图:

返回值通常是在参数的最后一个,参考例1,Func<int, float, string> MyFunc = null 这个委托中,string 就是返回值,传递参数的时候,也只能传递两个参数,如果再多写一个参数就会报错,如下图:

例1

基本的用法,func赋值,执行委托,并接收返回值

using System;

namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            string userName = test1.MyFunc(15, 180.2f);
            Console.WriteLine(userName);

            Console.ReadKey();
        }
    }

    public class Test1
    {
        public Func<int, float, string> MyFunc = null;

        private string GetUserName(int age, float height)
        {
            if (age == 15 && height == 180.2f)
            {
                return "张三";
            }
            return null;
        }

        public Test1()
        {
            MyFunc = GetUserName;
        }
    }
}

运行:

例2

把func作为方法的参数传递,并执行回调

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

namespace Test1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1 test1 = new Test1();
            Func<string> func = () =>
            {
                string name = "张三";
                string feel = "精力非常旺盛";
                string msg = name + feel;
                return msg;
            };
            test1.Calculation(10, 12, func);
            Console.ReadKey();
        }
    }

    public class Test1
    {
        public void Calculation(int x,int y, Func<string> sayFunc)
        {
            if(sayFunc != null)
            {
                int age = x + y;
                string msg = string.Format("年龄是:{0},对年龄的感受:{1}", age, sayFunc());
                Console.WriteLine(msg);
            }
        }
    }
}

运行:

上面代码只是作为一个参考,读者可以根据自己的需求做一个改进。

结束

到此这篇关于浅谈C#中Action和Func回调的常用方式的文章就介绍到这了,更多相关C# Action和Func回调内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#中异步回调函数用法实例

    本文实例讲述了C#中异步回调函数用法.分享给大家供大家参考.具体如下: static void Main(string[] args) { Func<string,string> showMessage = ShowMessage; //设置了回调函数Completed,不能有返回值 IAsyncResult result = showMessage.BeginInvoke("测试异步委托",new AsyncCallback(Completed),null); //半段异

  • C#文件流读写和进度回调示例详解

    前言 前不久遇到一个问题,是公司早期的基础库遇到的,其实很低级,但是还是记录下来.出错点是一个 IO 流的写入bug,我们项目会有一种专有的数据格式,这个格式的奇葩点在于如果设置 IO 读缓冲区为 2014 字节的时候,整个文件刚好能读完,也就是说其 length 刚好是 1024 的倍数.后来在一次升级中增加了更多的文件格式,并且新的文件格式使用了新的自定义写入流,具有加密和压缩的作用,这样一来,文件的长度就不一定是 1024 的倍数了. 后来通过查看这个基础类的源代码发现因为是 .NET 2

  • 详解C#中通过委托来实现回调函数功能的方法

    委托(delegate)是一种可以把引用存储为函数的类型,这类似于c++中的函数指针. 回调函数 c++中的回调函数,就是用函数指针来实现的.类似的,c#中用委托,来实现回调函数的功能. 回调函数为什么被称为回调函数?比如你调用了一个函数,那么就叫调用,但是如果你在调用一个函数的时候,还需要把一个函数提供给该函数,让这个函数来调用你的函数,那么你提供的这个函数就被称为回调函数(callback). 对于python这样的动态语言而言,就没有c#,c++提供特殊的语法实现回调函数,因为在pytho

  • C#的回调机制浅析

    本文简要分析了C#的回调机制.分享给大家供大家参考.具体分析如下: 1.回调听起来高大上,实际上本质就是委托,回调是委托的一种应用,其本质就是委托. 2.一般回调多用在线程,因此多声明为类级变量.(和类在同一级,不是在某个方法内部的局部变量). 3.设置: 复制代码 代码如下: Form1.CheckForIllegalCrossThreadCalls = false; 将检查合法跨线程调用设置为 false 表示不检查 项目开发中不允许这样使用,因此会导致非线程安全而出现奇葩BUG. 4.初始

  • C#程序窗体间使用回调事件方式通讯示例

    Form2: 复制代码 代码如下: //定义一个需要string类型参数的委托         publicdelegate void MyDelegate(string text);         public partial class Form2 :Form1         {                //定义该委托的事件             public event MyDelegate MyEvent;             public Form2(string te

  • 浅谈C#中Action和Func回调的常用方式

    目录 一.简介 二.Action 例1 例2 三.Func 例1 例2 结束 一.简介 Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明.Action系列泛型委托,是没有返回参数的委托,最多可以有16参数,也可以没有参数. Func系列的委托是有返回值的委托,最多可以有16个参数:元组是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.元组使用

  • 浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片测试,有的时候,我们并不需要对很多图像做测试,可能就是几张甚至一张.这种情况下没有必要用队列机制. import tensorflow as tf import matplotlib.pyplot as plt def read_image(file_name): img = tf.read_fil

  • 浅谈JS中几种轻松处理'this'指向方式

    我喜欢在JS中更改函数执行上下文的指向,也称为 this 指向. 例如,咱们可以在类数组对象上使用数组方法: const reduce = Array.prototype.reduce; function sumArgs() { return reduce.call(arguments, (sum, value) => { return sum += value; }); } sumArgs(1, 2, 3); // => 6 另一方面,this 很难把握. 咱们经常会发现自己用的 this

  • 浅谈C#中Md5和Sha1两种加密方式

    1.新建控制台应用程序 2.新建类 EncryptHelper.cs public static class EncryptHelper { /// <summary> /// 基于Md5的自定义加密字符串方法:输入一个字符串,返回一个由32个字符组成的十六进制的哈希散列(字符串). /// </summary> /// <param name="str">要加密的字符串</param> /// <returns>加密后的十六

  • 浅谈ElementUI中switch回调函数change的参数问题

    需求说明 八个switch组件,用同一个回调函数 switch组件状态发生变化时需要知道它目前开关状态 需要知道当前是哪个switch 问题描述 按照官方文档对switch事件的描述 事件名称 说明 回调参数 change switch 状态发生变化时的回调函数 新状态的值 下面这样写可以满足第二个需求,change回调函数中的参数callback就是开关当前的状态值,默认是boolean类型,但是第三个需求还不能解决. <el-switch v-model="value1" @

  • 浅谈Java中向上造型向下造型和接口回调中的问题

    最近回顾了一下java继承中的问题,下面贴代码: public class Base { protected String temp = "base"; public void fun(){ System.out.print("BASE fun()"); } public static void main(String[] args) { Base b =new Base();//实例化Base对象 b.fun(); //调用父类中fun()的方法 System.o

  • 浅谈JavaScript中的对象及Promise对象的实现

    JavaScript 中的所有事物都是对象:字符串.数值.数组.函数.下面小编给大家收集整理些javascript中的对象及promise对象的实现.具体内容如下: 到处都是对象 window对象 常用的属性和方法介绍 location 包含页面的URL,如果改变这个属性,浏览器会访问新的URL status 包含将在浏览器状态去显示的一个串.一般在浏览器左下角 onload: 包含了需要在页面完全加载后调用的函数 document: 包含DOM alert方法: 显示一个提醒 prompt方法

  • 浅谈Android中Service的注册方式及使用

    Service通常总是称之为"后台服务",其中"后台"一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: 1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的): 2.具有较长时间的运行特性. 1.Service AndroidManifest.xml 声明 一般而言,从Service的启动方式上

  • 浅谈PyQt5中异步刷新UI和Python多线程总结

    目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程.近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下. PyQt PyQt简介 PyQt是Qt的python接口,PyQt的文档较少,但接口和函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便.以下简介一个基本的PyQt程序. - 需要导入的类主要来自三个包 - from PyQt5.QtWidgets import 常用的控件 - PyQt5.QtCore 核心功能类,

  • 浅谈JavaScript中this的指向问题

    JavaScript中this指向问题 记得初学 JavaScript 时,其中 this 的指向问题曾让我头疼不已,我还曾私自将其与闭包.原型(原型链)并称 JS 武林中的三大魔头.如果你要想在 JS 武林中称霸一方,必须将这三大魔头击倒.个人认为在这三大魔头中,this 指向问题的武功最菜(难度最低).俗话说柿子捡软的捏,那我们就先从 this 指向问题下手. 先记住攻克 this 指向问题的口诀(前辈们的总结):哪个对象调用函数,函数里的 this 就默认指向哪个对象(注意 this 只能

随机推荐