使用委托的正确方法是什么?
本文关键字:方法 是什么 | 更新日期: 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!");
}
没有人应该仅仅为了使用委托而编写代码。