[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框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...
随机推荐
- openssl c_rehash
一.简介 c_rehash 为文件创建一个符号连接,并将此符号连接的名称设为文件的hash值,作用是让openssl在证书目录中能够找到证书. 二.语法 c_rehash [-old] [-h] [- ...
- Swift 学习笔记 enum 枚举类型
异端,异端啊,我感觉这是map吧? enum ATMStatus { case Success(Int) case Error(String) } func withdraw(amount: Int) ...
- C++模板(一)
1. 模板的概念. 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数 ...
- C语言变参问题
C++中有函数重载这种方法,以供我们调用时要可以不确定实参的个数,其实 C 语言也可以,而且更高明! 我们在stdio.h 中可以看到 printf() 函数的原型: int printf(char ...
- 【温故而知新-Javascript】对象
1 创建对象 Javascript 支持对象的概率.有多种方法可以用来创建对象. <!DOCTYPE html> <html lang="en"> < ...
- 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...
- ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法
ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用g ...
- codeforces 711E E. ZS and The Birthday Paradox(数学+概率)
题目链接: E. ZS and The Birthday Paradox. time limit per test 2 seconds memory limit per test 256 megaby ...
- 怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端?
今天在论坛上看到这样一个问题,有必要编辑搜集下. 问题描述:怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端 题主用jquery接收 <input name= ...
- UVA 12377 Number Coding --DFS
题意:给一串数字,第一个数是Num的话,要使后面的数字组成Num个数,而且为不降的,将这Num个数分配到9个素因子上作为指数,问能组成多少个不同的数 解法:dfs一遍,看后面的数字能组成Num个不降数 ...