目录

委托

Action

Func

总结

委托

委托的那些事

关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍。稍微回顾一下。

委托是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学习的更多相关文章

  1. C#基础——Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

  2. C#基础-Func,Action

    Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...

  3. [转载]C#基础-Func,Action

    Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...

  4. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  5. 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

    先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...

  6. 如何夯实(Java)编程基础,并深入学习和提高

    如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...

  7. 【web开发学习笔记】Structs2 Action学习笔记(两)

    action学习笔记2-大约action method讨论 Action运行的时候并不一定要运行execute方法,能够在配置文件里配置Action的时候用method=来指定运行哪个方法 也能够在u ...

  8. Func,Action 的介绍

    Func,Action 的介绍 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中 ...

  9. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

随机推荐

  1. ZOJ 3865 Superbot(优先队列--模板)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需 ...

  2. 数据结构--线段树--lazy延迟操作

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 53749   ...

  3. myeclipe eclipse 常遇问题:Some projects cannot be imported 、java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver、The file connot be validate

    1.Some projects cannot be imported because they already exist in the workspace 2.Some projects were ...

  4. PHP Cannot redeclare class CLassName

    可能导致Cannot redeclare class CLassName错误的原因: 1.在同一个文件中重复声明了两次同名的类: class Extend {} class Extend {} new ...

  5. HTML5与触摸界面

    习惯了开发典型的面向电脑端浏览器的网站在开发手机端网站或者移动App的时候面对很多新的问题,这些新的问题,在我看来或多或少会给浏览者在使用网站或App的时候带来不好的用户体验,对于一个产品级应用,用户 ...

  6. c++字符串互相转换

    1.string vs char* //string to char* string str; const char* cch = str.c_str(); ]; strcpy(ch,cch); // ...

  7. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  8. hihocoder-1389&&2016北京网赛07 Sewage Treatment(二分+网络流)

    题目链接: Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people could ...

  9. 通过imeMode禁用键盘只能输入数字

    var obj = document.getElementById('y'); var arr = [48,49,50,51,52,53,54,55,56,57];//数字对应的键码 obj.onke ...

  10. 制作苹果推送通知APNS服务器证书文件

    1.准备证书申请文件 打开苹果电脑实用工具里的钥匙串访问程序 选择钥匙串访问—>证书助理—>从证书颁发机构申请证书 输入邮件地址,常用名词随便命名,在这里命名为APNS 选择存储到磁盘,将 ...