• c# 委托


    用代码来讲话,例如下面是我们写的一段代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CSharp.Lambda
    {
       public class DelegateBefore
        {
            public long Add(int a,int b)
            {
                return a + b;
            }
    
            public long Multiply(int a, int b)
            {
                return a * b;
            }
    
            public long GetAdd(int a, int b)
            {
                Console.WriteLine("今天我们要学习委托啦啦乌啦啦~~~~");
                long result = Add(a, b);
                Console.WriteLine(result);
                Console.WriteLine("啦啦乌啦啦~~~~");
                return result;
            }
    
            public long GetMultiply(int a, int b)
            {
                Console.WriteLine("今天我们要学习委托啦啦乌啦啦~~~~");
                long result=Multiply(a, b);
                Console.WriteLine(result);
                Console.WriteLine("啦啦乌啦啦~~~~");
                return result;
            }
        }
    }


    可以看出GetAdd和GetMultiply函数大部分重复,又不好提取公共函数,那么这个时候可以用到委托,把函数当作参数来传递。

    还是用代码来说话,一目了然,怎么改写代码呢,使用委托后的代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CSharp.Lambda
    {
        public class Delegate
        {
            public long Add(int a,int b)
            {
                return a + b;
            }
    
            public long Multiply(int a, int b)
            {
                return a * b;
            }
    
            public long GetAdd(int a, int b)
            {
                //第一个前面的参数类型为函数的参数类型
                //最后一个参数类型是返回值的参数类型
                //无返回值不写
                //static类型函数不能委托
                Func<int, int, long> all = new Delegate().Add;
               return GetAll(all, a, b);
            }
    
            public long GetMultiply(int a, int b)
            {
                Func<int, int, long> all = new Delegate().Multiply;
                return GetAll(all, a, b);
            }
    
            public long GetAll(Func<int, int, long> all, int a, int b)
            {
                Console.WriteLine("今天我们要学习委托啦啦乌啦啦~~~~");
                long result = all(a, b);
                Console.WriteLine(result);
                Console.WriteLine("啦啦乌啦啦~~~~");
                return result;
            }
    
        }
    }

    单元测试一下是否正确:

    using CSharp.Lambda;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System;
    
    namespace Test
    {
        [TestClass()]
        public class DelegateBeforeTest
        {
            [TestMethod()]
            public void GetMultiplyTest()
            {
                CSharp.Lambda.DelegateBefore target = new CSharp.Lambda.DelegateBefore(); 
                int a = 10; 
                int b = 20;
                long result = target.GetMultiply(a, b);
                Assert.AreEqual(200,result);
            }
    
            [TestMethod()]
            public void GetAddTest()
            {
                CSharp.Lambda.DelegateBefore target = new CSharp.Lambda.DelegateBefore();
                int a = 10;
                int b = 20;
                long result = target.GetAdd(a, b);
                Assert.AreEqual(30, result);
            }
        }
    }
    using CSharp.Lambda;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System;
    
    
    namespace Test
    {
        [TestClass()]
        public class DelegateTest
        {
            [TestMethod()]
            public void GetMultiplyTest()
            {
                CSharp.Lambda.Delegate target = new CSharp.Lambda.Delegate();
                int a = 10;
                int b = 20;
                long result = target.GetMultiply(a, b);
                Assert.AreEqual(200, result);
            }
    
            [TestMethod()]
            public void GetAddTest()
            {
                CSharp.Lambda.Delegate target = new CSharp.Lambda.Delegate();
                int a = 10;
                int b = 20;
                long result = target.GetAdd(a, b);
                Assert.AreEqual(30, result);
            }
        }
    }

    测试正确。


    Func<T, TResult> 委托

    in T

    此委托封装的方法的参数类型。

    out TResult

    此委托封装的方法的返回值类型。

    封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。

  • 相关阅读:
    Android4.0 以后不允许在主线程进行网络连接
    关于升级linux下apache
    事物复制中大项目(Large Article)出问题如何快速修复
    国企银行面试总结
    Git命令详解(一)-个人使用
    函数体的规模要小,尽量控制在 50 行代码之内
    函数的功能要单一,不要设计多用途的函数
    在函数体的“出口处”,对 return 语句的正确性和效率进行检查
    在函数体的“入口处”,对参数的有效性进行检查
    有些场合用“引用传递”替换“值传 递”可以提高效率
  • 原文地址:https://www.cnblogs.com/echolxl/p/4717754.html
Copyright © 2020-2023  润新知