使用委托的正确方法是什么?

本文关键字:方法 是什么 | 更新日期: 2023-09-27 18:17:35

在我的一次实验中,我遇到了一个与委托相关的问题,我的解决方法如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateApp
{
    delegate void GreeterDelegate();
    class Program
    {
        static void GreetGoodMorning()
        {
            if (DateTime.Now.ToString().EndsWith("AM"))
                Console.WriteLine("Good Morning!");
        }
        static void GreetGoodEvening()
        {
            if (DateTime.Now.ToString().EndsWith("PM"))
                Console.WriteLine("Good Evening!");
        }
        static void Main(string[] args)
        {
            GreeterDelegate Greeters = new GreeterDelegate(GreetGoodMorning);
            Greeters += GreetGoodEvening;
            Greeters();
            Console.ReadLine();
        }
    }
}

我所做的是使用条件来检查方法内部的时间。但一位实验室教员建议我这样做:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateApp
{
    delegate void GreeterDelegate();
    class Program
    {
        static void GreetGoodMorning()
        {
            Console.WriteLine("Good Morning!");
        }
        static void GreetGoodEvening()
        {
            Console.WriteLine("Good Evening!");
        }
        static void Main(string[] args)
        {
            GreeterDelegate Greeters;
            if (DateTime.Now.ToString().EndsWith("AM"))
                Greeters = new GreeterDelegate(GreetGoodMorning);
            else
                Greeters = new GreeterDelegate(GreetGoodEvening);
            Greeters();
            Console.ReadLine();
        }
    }
}

他建议将条件从方法中移到Main()方法中。最终的结果是一样的,但是我仍然很困惑,特别是考虑到在大型程序中使用委托,是否应该将条件检查移到方法中还是应该保留在外面。

使用委托的正确方法是什么?

最后一个示例更好,因为您没有多余的检查要使用哪个方法+调用更少。这将导致更好的性能,因为您的检查将在运行时进行。

这不是委托的问题,而是编码实践的问题。

在你的代码中,你调用了两个委托,但只有一个在控制台中显示文本。

在建议的代码中只调用一个委托。

第二个实现更有效,也是您应该使用的实现。从编程的角度来看,代码的意图也更清晰了。

当你要执行一个操作时,最好先决定你想要执行的操作,然后再执行,而不是在每个操作中都进行检查。

如果你喜欢吃豆子当晚餐,你不会从橱柜里拿出每一个罐头,然后决定你是否要豆子,那个罐头里是否有豆子。你检查每一个罐子,看看里面是否有豆子,然后只取下那一个。

它们都不是好代码。这些只是构造的示例,用于显示委托的语法和用法。在这个示例中,您根本不需要委托,因为它只是对函数的普通调用。

委托在以下条件下是有用的:

  • 在运行时动态确定的方法(调用方法A、B或C)
  • 回调方法(允许指定被其他方法调用的方法)
  • 组播操作(方法A、B和C被代码X调用)
  • X没有关于A、B或C的任何信息

两个样本不具有相同的含义。我更喜欢第一个版本,因为它言出必行。GreetGoodMorning检查现在是不是早上,如果不是,它就不做任何事情。我将把第二个版本重写如下:

 static void Greet() 
 { 
    if (DateTime.Now.ToString().EndsWith("PM")) 
        Console.WriteLine("Good Evening!"); 
    else
        Console.WriteLine("Good Morning!"); 
 } 

没有人应该仅仅为了使用委托而编写代码。