首页 > 编程语言 >C# action,delegate,func的用法和区别

C# action,delegate,func的用法和区别

时间:2023-11-28 14:15:47浏览次数:33  
标签:小明 string C# void Func Book delegate func Action

  举个委托的例子:

  小明去书店买一本书。

  1、 买书:

 private delegate void BuyBook();

  2、附近书店 (委托的方法):

public static void Book()
{
    MessageBox.Show("提供书籍");
}

  3、小明和书店建立关系(给委托绑定方法)

 BuyBook buybook = new BuyBook(Book);

  4、小明给钱拿走书:

buybook();

  结果:

  Action的用法

  那有没有一种方法不去定义委托呢?

  Action<T1,T2,T3>:参数都为封装的参数,无返回值。

Action BookAction = Book;
BookAction();

  结果:

  小明现在想买其他书,那么只需要把参数传过去就可以了:

public static void Book(string BookName)
{
    MessageBox.Show($"买一本{BookName}");
}

private void button1_Click(object sender, EventArgs e)
{
    Action<string> BookAction = Book;
    BookAction("《三国演义》");
}

  结果:

  然后小明现在想去其他家书店买,那么就要用到Action<T1,T2>:

public static void Book(string BookName, string BookStore)
{
    MessageBox.Show($"在{BookStore}里买一本{BookName}");
}

private void button1_Click(object sender, EventArgs e)
{
    Action<string, string> BookAction = Book;
    BookAction( "《三国演义》","新华书店");
}

  结果:

 

  Func用法

  小明觉得买书要到书店买太麻烦,能不能网购寄到我家呢?这时可用到Func。

  Func<T1,T2,T3>:最后一个参数(T3)表示返回值类型,前面的(T1,T2)都是形参类型。

  (无参数有返回值

public static string SendBook()
{
    return "买的书送到家里了";
}

private void button1_Click(object sender, EventArgs e)
{
    Func<string> sendBook = SendBook;
    MessageBox.Show(sendBook());
}

  结果:

  接着小明想网购一本《三国演义》(有参数有返回值):

public static string SendBook(string BookName)
{
    var str = $"买的书{BookName}送到家里了";
    return str;
}

private void button1_Click(object sender, EventArgs e)
{
    Func<string, string> sendBook = SendBook;
    MessageBox.Show(sendBook("《三国演义》"));
}

  结果:

 

  总结:

  1. Action用于无返回值的函数(参数个数可根据需要传入)
  2. Func用于有返回值的函数(参数个数可根据需要传入)

 

标签:小明,string,C#,void,Func,Book,delegate,func,Action
From: https://www.cnblogs.com/shieryoufeng/p/17861822.html

相关文章

  • 京东广告研发近期入选国际顶会文章系列导读——CIKM 2023篇
    近年来,放眼业界广告推荐领域的算法获得了长足的发展,从几篇奠定基础的序列学习、大规模图学习、在线学习&增强学习、多模态推荐问题等起步,业内算法不断迭代发展并在学术和工业场景上取得不错的应用。京东广告团队不仅在工业场景上非常重视实践,并不断为由“广告主”、“消费者”、......
  • Docker的CI/CD流水线简单配置(在windous本地配置)
    在做配置之前,请先了解一下知识点,更加方便了解下面代码:1.文件后缀名为.yml2.gitlab-runner3.CI/CD了解完之后就开始本次代码讲解(一定要先进行了解)首先先要做一些准备工作,方便下面步骤的使用1.运行docker里的gitlab2.找到你想应用的项目仓库里去设置弄一个访问令牌 添加一......
  • rust 运行windows cmd命令
    usestd::process::Command;fncallcmd(cmdstr:&str){Command::new("cmd").arg("/S").arg("/c").arg(cmdstr).output().expect("-1&......
  • Golang - context.TODO()和context.Background()的区别
    context.Background():上下文的默认值(创建上下文的默认起点),这个函数返回一个空context,返回值就是根节点,这只能用于最高等级(在main函数、初始化或顶级请求处理中),因为所有其他的上下文都应该从它衍生(Derived)出来context.TODO():通常用作占位符或临时解决方案,只在不确定应该使用哪种上......
  • CPU原理学习
    本文是对B站踌躇月光大佬的8位二进制CPU实现教程的学习记录非常感谢这位大大能够提供这么好的教程!!!OvO半加法器半加器是指对输入的两个一位二进制数相加(A与B),输出一个结果位(S)和进位(C),没有进位的输入加法器电路,是一个实现一位二进制数的加法电路。计算公式:S=A^B(A异或B)C=......
  • Windows AMD install PyTorch
    根据本机python版本,创建pytorch环境condacreate-npytorchpython=3.11激活pytorch环境activatepytorch设置清华镜像condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/condaconfig--addchannelshttps://mirrors.tuna.tsinghua.......
  • C++ Primer 学习笔记——第十三章
    第十三章拷贝控制前言类是如何控制类型对象的拷贝、赋值、移动和销毁的?类通过一些特殊的成员函数控制,包括:拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符以及析构函数。当定义一个类时,我们显式地或隐式的指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一......
  • [信创]--达梦DM8数据库-docker方式部署
    下载:https://www.dameng.com/list_103.html下载镜像,上传到指定服务器:载入镜像:查看镜像: 启动容器:dockerrun-d-p5237:5236--restart=always--namedm8--privileged=true-eCASE_SENSITIVE=0\-ePAGE_SIZE=32-eEXTENT_SIZE=32-eUNICODE_FLAG=1-eLENGTH_IN......
  • kafka中如何创建topic?
    通过如下的命令创建topickafka-topics.sh\--bootstrap-server<Kafka集群地址>\--create\--topic<Topic名称>\--partitions<分区数>\--replication-factor<副本因子>  示例bin/kafka-topics.sh\--bootstrap-server122.12......
  • pytest参数化数据来源于excel文件时,如果读取参数化数据?
    一、问题pytest参数化数据来源于excel文件时,如果读取参数化数据? 二、回答有两种获取方式:1.列表嵌套列表的方式2.列表嵌套字典的方式更加推荐第2种列表推荐字典的方式,这样就算excel增加一列也没关系,不用大动代码,而列表嵌套列表的方式,一旦excel增加或减少一列,pytest.mark.para......