在我的一次实验课中,我遇到了与代表相关的问题,我解决了以下问题:
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()
方法。最终的结果是一样的,但我仍然感到困惑的是哪种方式更好的方法,特别是考虑在大型程序中使用委托,是否应将条件检查移入方法或应保留在外面。
答案 0 :(得分:3)
最后一个样本更好,因为你没有冗余的检查方法可以使用+更少的调用。这将带来更好的性能,因为您的检查将在运行时进行。
答案 1 :(得分:2)
这不是代表们的问题,而是编码实践。
在您的代码中,您调用两个代理,但只有一个在控制台中显示文本。
在建议的代码中,只调用一个代理。
第二种实现更有效,也是您应该使用的实现。从编程的角度来看,代码的意图也更清晰。
每当您要执行某个操作时,最好先决定要执行哪个操作,然后执行该操作,而不是将检查放在每个操作中。
如果你喜欢吃晚饭的豆子,你就不会把每一罐都拿出橱柜,然后决定你是否想要豆子,以及豆子是否含有豆子。你可以检查每个罐子里面是否有豆子,只能找到它。
答案 2 :(得分:1)
它们都不是好代码。这些只是构造的示例,以显示委托的语法和用法。在此示例中,您根本不需要委托,因为它只是对函数的正常调用。
代表在以下条件下很有用:
两个样本的含义不同。我更喜欢第一个版本,因为它符合它的说法。 GreetGoodMorning检查是否是早晨,如果不是,则不做任何事情。我会将第二个版本重写为以下内容:
static void Greet()
{
if (DateTime.Now.ToString().EndsWith("PM"))
Console.WriteLine("Good Evening!");
else
Console.WriteLine("Good Morning!");
}
没有人应该编写任何代码来使用委托。