当前位置:首页 > 技术知识 > 正文内容

如何使用 C# 中的 Action, Func_c# funclamdba

maynowei7个月前 (10-02)技术知识69

译文链接:
https://www.infoworld.com/article/3057152/how-to-work-with-action-func-and-predicate-delegates-in-csharp.html?nsdr=true

委托是一个类型安全的函数指针,它可以引用与委托具有相同签名的方法。委托常用于实现回调方法或者事件机制,在C#中一般用 "delegate" 关键字声明。你可以声明一个和类平级的委托,也可以嵌套在类中。

Func 和 Action 是什么,如何使用?

两者最基本的区别是,前者适合那些需要带返回值的委托,后者适合那些不带返回值的委托。

Func 所引用的方法接收一个或者多个入参并带有一个返回值,Action所引用的方法接收一个或者多个参数并且没有返回值,换句话说,你的委托所引用的方法没有返回值,这时候适合用 Action。

Predicate所引用的方法接收一个或者多个泛型参数并且返回一个 bool 值,你可以假定它等价于 Func<T,bool>,Predicate 常用于对 collection 进行一组条件检索。

C# 中使用 Action

你可以使用 委托 去实现事件和回调方法,C#委托非常类似于C++中的函数指针,但是 C# 中的 委托 是类型安全的,你可以将方法作为参数传递给委托从而让委托指向该方法。

下面的代码片段展示了 Action 委托的语法结构。


Action<TParameter>

接下来的代码清单展示了如何使用 Action 委托,当下面的代码执行结束后会在控制台打印 Hello !!!

        static void Main(string[] args)
        {
            Action<string> action = new Action<string>(Display);
            action("Hello!!!");
            Console.Read();
        }

        static void Display(string message)
        {
            Console.WriteLine(message);
        }

C# 中使用 Func

现在我们一起学习下 Func 委托,下面是 Func 的语法结构。


Func<TParameter, TOutput>

接下来的代码片段展示了如何在 C# 中使用 Func 委托,最终方法会打印出 Hra(基本薪资的 40%) 的值,基本薪资是作为参数传下去的,如下代码所示:


        static void Main(string[] args)
        {
            Func<int, double> func = new Func<int, double>(CalculateHra);
            Console.WriteLine(func(50000));
            Console.Read();
        }
        static double CalculateHra(int basic)
        {
            return (double)(basic * .4);
        }

值得注意的是,Func 委托的第二个参数表示方法的返回值,在上面这个例子中,它就是计算后的 Hra 值,作为 double 型返回。

C# 中使用 Predicate

Predicate 委托常用于检索 collection,下面是 Predicate 的语法结构。

Predicate<T>

值得注意的是, Predicate<T> 差不多等价于 Func<T,bool>

考虑下面的 Customer 实体类。


    class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Country { get; set; }
    }

接下来生成一个 customer 集合并且丢一些数据进去,如下代码:


            List<Customer> custList = new List<Customer>();
            custList.Add(new Customer { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India" });
            custList.Add(new Customer { Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US" });

接下来是完整的代码片段展示了如何使用 Predicate 去检索集合。


        static void Main(string[] args)
        {
            List<Customer> custList = new List<Customer>();
            custList.Add(new Customer { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India" });
            custList.Add(new Customer { Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US" });
            Predicate<Customer> hydCustomers = x => x.Id == 1;
            Customer customer = custList.Find(hydCustomers);
            Console.WriteLine(customer.FirstName);
            Console.Read();
        }

当上面的代码被成功执行, 控制台将会输出 Joydip

更多高质量干货:参见我的 GitHub: dotnetfly**

相关文章

第四章:产品设计(2.3)PRD写作 - 原型设计

2.3、原型设计(界面线框图)当我们逐渐清晰了产品的需求后,并梳理了产品的各个频道及页面,那么这一步就要开始验证这些想法的具体界面表现和方案的可行性了。原型设计是帮助我们更细致的思考,并做各项需求的评...

C语言进阶教程:线程同步:互斥锁、条件变量与信号量

在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。当多个线程需要访问共享资源时,如果缺乏适当的同步机制,就可能导致竞态条件(Race Condition)、死锁(Deadlock)等问题。本...

Linux C++实现多线程同步的四种方式(超级详细)

背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#inc...

6 张图带你彻底搞懂分布式事务 XA 模式

XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口。目前主流的数据库,比如 oracle、DB2 都是支持 XA 协议的。mys...

你可能疏忽的plsql和navicat连接Oracle注意点

在日常开发中,我们总是少不了要连接数据库,你是否遇到过填写的账号、密码、连接地址都对,但就是连接不上Oracle的情况?这里说一下其中一种连接不上Oracle的原因,这种情况简单,但很可能被疏忽。记下...

见招拆招:破解Oracle数据库密码(oracle数据库如何解锁)

一.概要本文主要目的,希望通过分享解密方法引起相关人士对网络安全的重视。数据库安全绝不单只数据库本身的安全,和数据库所处的整个环境都有密切关系。本文所说的破解oracle9i、oracle10g、or...