[C#基础]Func和Action学习
目录
委托
关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍。稍微回顾一下。
委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针
声明委托的方式:delegate 返回值类型 委托类型名(参数)
例如:
delegate void Say(string strContent);如果想使用该委托,需要一个对应的方法。
/// <summary>
/// 委托对应方法
/// </summary>
/// <param name="strContent"></param>
private static void ChineseSay(string strContent)
{
Console.WriteLine(strContent);
}简单的调用:
static void Main(string[] args)
{
Say sy = new Say(ChineseSay);//方式一
Say say = ChineseSay;//方式二
sy("您好");
say("您好");
Console.Read();
}
上面介绍了,平时用委托的一般方式,先声明委托,然后再去使用,有点麻烦,.net中有已经定义好的委托类型,可以拿来直接用。
Action
Action委托有两种方式:无参数无返回值的委托,有至少一个最多16个的参数无返回值的泛型委托。
// 摘要:
// 封装一个方法,该方法不具有参数并且不返回值。
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
public delegate void Action();
Action泛型委托根据输入参数个数的不同,Action委托有十六个重载
用Action改写上面的例子,上面的例子中委托是无返回值有string类型的输入参数,所以使用Action的泛型版本。
class Program
{
static void Main(string[] args)
{
Action<string> SayHello = new Action<string>(ChineseSay);//方式一
Action<string> SayName = ChineseSay;//方式二
Action<string> SayAge = s => Console.WriteLine("我今年{0}岁了", s);//方式三
SayHello("您好");
SayName.Invoke("我叫Wolfy");
IAsyncResult result = SayAge.BeginInvoke("", CallBack, "爱好女");
if (result.IsCompleted)
{
SayAge.EndInvoke(result);
}
Console.Read();
} private static void CallBack(IAsyncResult ar)
{
Console.WriteLine("介绍完毕,忘了,我{0},我不搞基",ar.AsyncState.ToString());
}
/// <summary>
/// 委托对应方法
/// </summary>
/// <param name="strContent"></param>
private static void ChineseSay(string strContent)
{
Console.WriteLine(strContent);
}
}
结果:
上面代码中,列出了Action泛型委托的使用方式,以及使用Lambda的方式,Action也可以使用匿名方法,选择一种自己上手的来用即可。
Func
如果要用有输入参数,有返回值的委托,那么Func委托将满足你的要求。
Func泛型委托,可以没有输入参数,但必须有返回值。根据输入参数的多少有17个重载。
in:输入参数
out:输出参数,也就是返回值。
一个案例
输入名字,年龄,性别,对年龄,性别,姓名进行修改后输出。
public class Person
{
public string Name { set; get; }
public int Age { set; get; }
public bool Gender { set; get; }
/// <summary>
/// 重写tostring方法,方便输出结果
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Name + "\t" + Age + "\t" + Gender;
}
}
class Program
{
static void Main(string[] args)
{
Func<Person, Person> funcUpdateAge = new Func<Person, Person>(UpdateAge);
Func<Person, Person> funcUpdateAge2 = UpdateAge;
Func<Person, Person> funcUpdateGender = (p1) => { p1.Gender = false; return p1; };//lambda表达式方式
Func<Person, Person> funUpdateName = delegate(Person p2)//匿名方法
{
p2.Name = "Wolfy2";
return p2;
};
Person p = new Person() { Name = "Wolfy", Age = , Gender = true };
Person result = funcUpdateAge(p);
Console.WriteLine(result.ToString());
Console.WriteLine(funcUpdateGender(p).ToString());
Console.WriteLine(funUpdateName(p).ToString());
Console.Read();
}
static Person UpdateAge(Person p)
{
p.Age = ;
return p;
} }
结果:
Func泛型委托,可以没有输入参数,但是必须有输出参数。
总结
Action:无参数无返回值委托。
Action<T>:泛型委托,无返回值,根据输入参数的个数不同有十六个重载。
Func< out T>:无输入参数,有返回值。
Func<in T,out T>:有输入参数,有返回值,根据输入参数个数不同,有十六个重载。
Action和Func中可以使用Lambda和匿名方法处理方法体内逻辑。
(天太热,人很躁,在你不知道做什么的时候,不如静下来对基础进行查漏补缺,能掌握一点是一点,别总抱怨,总烦躁,就算你抱怨,烦躁,最后该完成的事还是你的,不多不减就在那里,夏天这天气,太烦躁,啥事都不做了吗?难道敲代码不是一件开心的事吗?)
[C#基础]Func和Action学习的更多相关文章
- C#基础——Func和Action的介绍及其用法
Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...
- C#基础-Func,Action
Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...
- [转载]C#基础-Func,Action
Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...
- iOS系列 基础篇 07 Action动作和输出口
iOS系列 基础篇 07 Action动作和输出口 目录: 1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...
- 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系
先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- 【web开发学习笔记】Structs2 Action学习笔记(两)
action学习笔记2-大约action method讨论 Action运行的时候并不一定要运行execute方法,能够在配置文件里配置Action的时候用method=来指定运行哪个方法 也能够在u ...
- Func,Action 的介绍
Func,Action 的介绍 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中 ...
- Func和Action委托简单用法
Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...
随机推荐
- iptables 详解
一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...
- 计算机中的颜色XIV——快速变换颜色的V分量
基本知识回顾: 计算机中的颜色Color,用RGB模式存储(用R.G.B三个分量表示颜色,每个分量的范围是0—255). 而计算机中的颜色除了用RGB模式表示以外,常见的还有HSV模式(或者是HSB. ...
- ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法
ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用g ...
- 怎样用ZBrush快速雕刻皮肤纹理
今天的ZBrush教程我们将对利用基础笔刷制作出的“亡灵僵尸”头部模型进行皮肤纹理的处理,主要用到了Layers 3D图层和Alpha笔触类型添加皮肤纹理. 详细的视频教程地址可前往:http://w ...
- 关于CSS中的字体尺寸设置 em rem等
常用单位 在CSS中可以用很多不同的方式来设定字体的尺寸.一般来说,这些单位被分成两大类:绝对单位(absolute)和相对单位(relative). 绝对单位在大多数情况下是相对于某些实际量度而言的 ...
- MySQL数据库学习笔记(五)----MySQL字符串函数、日期时间函数
一.常见字符串函数: 1.CHAR_LENGTH 获取长度(字符为单位) 2.FORMAT 格式化 3.INSERT 替换的方式插入 4.INSTR 获取位置 5.LEFT/RIGHT 取左 ...
- 第10章 同步设备I/O和异步设备I/O(4)_利用I/O完成端口实现Socket通信
I/O完成端口原理见上一篇(可点击这里) 10.5.4.4 利用I/O完成端口实现Socket通信 (1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函 ...
- 创建自定义的Cocos2d-x场景
操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...
- 狮子和计算Java题
package cn.bdqn.com; import java.util.Scanner; public class Jisaunqi { int num1; int num2; int jiegu ...
- jsp 微信公众平台 token验证(php、jsp)(转载)
微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把 ...