[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框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...
随机推荐
- openresty(nginx)、lua、drizzle调研
一.概述: 1.研究目标:nginx中使用lua脚本,及nginx直接访问mysql,redis 2.需要安装的内容: openresty,mysql,redis 3.OpenResty (也称为 n ...
- appium 常用api介绍(2)
前言:接着上一篇继续讲常用的一些api 参考博文:http://blog.csdn.net/bear_w/article/details/50330565 1.send_keys send_keys( ...
- uva 558 tree(不忍吐槽的题目名)——yhx
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- SQLConnect_ref.cpp
// SQLConnect_ref.cpp // compile with: odbc32.lib #include <windows.h> #include <sqlext.h&g ...
- org.springframework.web.context.ContextLoaderListen 报错解决办法
今天搭建SSH项目的时候出现了如下错误: 严重: Error configuring application listener of class org.springframework.web.con ...
- 看ImplicitBackwardEulerSparse关于static solve的代码
当选择static solve的时候,求解的流程如下: 1.获得内力 2.qresidual = 外力-内力,qdelta = qresidual, qdelta的非约束元素赋给bufferConst ...
- usb驱动开发8之配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...
- Maximal Square
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...
- js中的预加载与懒加载(延迟加载)
js中加载分两种:预加载与延迟加载 一. 预加载,增强用户的体验,但会加载服务器的负担.一般会使用多种 CSS(background).JS(Image).HTML(<img />) . ...
- 深入理解abstract class和interface(转)
原文地址 深入理解abstract class和interface java提高篇(四)-----抽象类与接口