2011-12-13 64 views
4

在我的实验课之一,我被赋予与我解决了作为初级讲座代表了一个问题:使用委托的正确方法是什么?

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()方法移出的条件。最终的结果是一样的,但我仍然困惑着哪种方式是更好的方法,尤其是考虑到在大型程序中使用委托,条件检查应该移入方法还是应该放在外部。

+1

该代码是非常人造的,你永远不会使用委托来完成程序的目标。但代表的观点是稍后*打电话。所以,是的,检查代表目标中的时间将是明智的。这里绝对不需要的是有多个目标,电讯局长试图帮助你避免犯这个错误。 –

回答

1

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

代表在下列条件下是有用的:

  • 方法在运行时(方法A,B或C被调用)
  • 回调方法(使能指定一个其通过一些称为方法动态determinded其他方法)
  • 组播操作(方法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!"); 
} 

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

+0

是的,你是对的。在这个例子中,我和教员一样讨论了代表需要的问题。可以完全不使用代表。唯一的问题是在哪里进行有条件的检查。 – nayaab

+0

我对此加入了我的想法。我甚至不认为第二个样本更好。 – slfan

3

最后一个样本比较好,因为您没有多余的检查方法来使用更少的调用。这将导致更好的性能,因为您的支票将在运行时发生。

2

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

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

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

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

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

如果你喜欢吃晚饭,你不会把每一罐都拿出柜子,然后决定你是否想要豆子,以及它是否有豆子。你检查每个罐子,看它里面有没有豆子,只有那个豆子掉下来。