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

时间:2011-12-13 11:24:07

标签: c# delegates

在我的一次实验课中,我遇到了与代表相关的问题,我解决了以下问题:

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()方法。最终的结果是一样的,但我仍然感到困惑的是哪种方式更好的方法,特别是考虑在大型程序中使用委托,是否应将条件检查移入方法或应保留在外面。

3 个答案:

答案 0 :(得分:3)

最后一个样本更好,因为你没有冗余的检查方法可以使用+更少的调用。这将带来更好的性能,因为您的检查将在运行时进行。

答案 1 :(得分:2)

这不是代表们的问题,而是编码实践。

在您的代码中,您调用两个代理,但只有一个在控制台中显示文本。

在建议的代码中,只调用一个代理。

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

每当您要执行某个操作时,最好先决定要执行哪个操作,然后执行该操作,而不是将检查放在每个操作中。

如果你喜欢吃晚饭的豆子,你就不会把每一罐都拿出橱柜,然后决定你是否想要豆子,以及豆子是否含有豆子。你可以检查每个罐子里面是否有豆子,只能找到它。

答案 2 :(得分:1)

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

代表在以下条件下很有用:

  • 在运行时动态确定的方法(方法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!"); 
 } 

没有人应该编写任何代码来使用委托。