zoukankan      html  css  js  c++  java
  • c#中,委托Func的简单实践

    c# 委托Func简单实践
    最近才真正的接触委托,所以针对Func类型的委托,做一个实践练习


    首先说一些我对委托的初级理解:“就是把方法做参数,传进委托方法里”。

    平时用到的有三种:
    1、把方法A()传进委托,委托中直接执行方法A()
    2、把方法A(int index)传进委托,委托中创建A中的参数index,然后执行方法A(index)
    3、把方法A(int index)index值都传进委托,委托中直接执行方法A(index)

    Func在我的理解中是一个必须有返回值的,可以使用范型委托

    我可以把Func比喻成一个面包房,与上面三种方法对应例子就是:
    1、我把做面包的方法,告诉给面包房,面包房可以自动生产一个面包出来。
    2、我把做面包的方法(此方法需要人工实现),告诉给面包房,面包房找一个员工,根据方法,做出来一个面包。
    3、我租借面包房的地方,我自己待着做面包的方法(此方法需要人工),自己通过方法,做出来一个面包。

     以下为代码实现过程。

    首先建立两个实体 客人(Customer) 与 员工(Employee)

    Customer:

    /// <summary>
    /// 客人
    /// </summary>
    public class Customer
    {
        public string Name { get; set; }
    }
    View Code

    Employee:

    /// <summary>
    /// 员工
    /// </summary>
    public class Employee
    {
        public string Name { get; set; }
    }
    View Code

    然后 建立面包实体(BreadInfo)

    /// <summary>
    /// 面包
    /// </summary>
    public class BreadInfo
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
    }
    View Code

    建立一个面包房类(Bakery)

    /// <summary>
    /// 面包房
    /// </summary>
    public class Bakery
    {
        /// <summary>
        /// 做食物
        /// </summary>
        /// <typeparam name="T">范型(食物类型)</typeparam>
        /// <param name="func"></param>
        /// <returns></returns>
        public static T MakeFood<T>(Func<T> func)
        {
            //直接执行方法
            return func();
        }
    
        /// <summary>
        /// 通过面包房员工 做食物
        /// </summary>
        /// <typeparam name="T">范型(食物类型)</typeparam>
        /// <param name="func"></param>
        /// <returns></returns>
        public static T MakeFoodByEmployee<T>(Func<Employee, T> func)
        {
            //找一个面包房员工
            Employee e = new Employee();
    
            //将参数e(面包房员工)传进方法中
            return func(e);
        }
    
        /// <summary>
        /// 租借面包房 做食物
        /// </summary>
        /// <typeparam name="T">范型(食物类型)</typeparam>
        /// <param name="func"></param>
        /// <param name="c"></param>
        /// <returns></returns>
        public static T BorrowMakeFood<T>(Func<Customer, T> func, Customer c)
        {
            //将参数c(客户)传进方法中
            return func(c);
        }
    }

    建立一个方法类(Function)  方法中有做面包的三种方式

    /// <summary>
    /// 做面包方法类
    /// </summary>
    public class Function
    {
        /// <summary>
        /// 直接做面包
        /// </summary>
        /// <returns></returns>
        public static BreadInfo MakeBread()
        {
            return new BreadInfo();
        }
    
        /// <summary>
        /// 用过客户自己 做面包
        /// </summary>
        /// <param name="c">客户自己</param>
        /// <returns></returns>
        public static BreadInfo MakeBreadByCustomer(Customer c)
        {
            return new BreadInfo();
        }
    
        /// <summary>
        /// 用过面包房员工 做面包
        /// </summary>
        /// <param name="e">面包房员工</param>
        /// <returns></returns>
        public static BreadInfo MakeBreadByEmployee(Employee e)
        {
            return new BreadInfo();
        }
    }

    完毕以后 就可以调用了。

    //直接让面包房自动 做面包
    var f = Bakery.MakeFood(Function.MakeBread);
    
    //通过面包房员工 做面包(员工是面包房自动提供的 不用传进去)
    var f1 = Bakery.MakeFoodByEmployee(Function.MakeBreadByEmployee);
    
    //客户自己租借面包房地点 做面包(客户自己需要传进去)
    Customer c = new Customer();
    var f2 = Bakery.BorrowMakeFood<BreadInfo>(Function.MakeBreadByCustomer, c);

    一个简单Func类型委托实现完毕,有很多不足,希望各位大大能够指正

  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/yinq/p/6288870.html
Copyright © 2011-2022 走看看