繁体   English   中英

为什么在.Net中使用代理

[英]Why to use delegates in .Net

我正在阅读一些文章,该文章通过以下示例描述了委托的使用,该示例显示了多播委托的使用

 public delegate void ProgressReporter(int percentComplete);
class Program
{
    static void Main(string[] args)
    {
        ProgressReporter p = WriteProgressToConsole;
        p += WriteProgressToFile;
        Utility.HardWork();
    }

    private static void WriteProgressToConsole(int percentComplete)
    {
        Console.WriteLine(percentComplete);
    }

    private static void WriteProgressToFile(int percentComplete)
    {        
        System.IO.File.WriteAllText("progress.txt", percentComplete.ToString());           
    }
}


  public static class Utility
{
    public static void HardWork(ProgressReporter p)
    {
        for (int i = 0; i < 10; i++)
        {     
            p(i);
            System.Threading.Thread.Sleep(1000);
        }
    }
}

但是根据我对代码的理解,我认为可以使用类来完成同样的功能,并且具有相同的功能,这些功能定义委托处理程序完成的任务,如下所示

 public static class ProgressReporter
{
    public static void WriteProgressToConsole(int percentComplete)
    {
        Console.WriteLine(percentComplete);
    }

    public static void WriteProgressToFile(int percentComplete)
    {
        System.IO.File.WriteAllText("progress.txt", percentComplete.ToString());
    }
}

并按如下方式更改Utility类HardWork()

 public static class Utility
{
    public static void HardWork()
    {
        for (int i = 0; i < 10; i++)
        {
            ProgressReporter.WriteProgressToConsole(i * 10);
            ProgressReporter.WriteProgressToFile(i * 10);
            System.Threading.Thread.Sleep(1000);
        }
    }
}

所以我对这段代码的问题是,为什么我们实际上需要一个代表呢?

我认为我们需要代表的一些原因(如果我错了,则正确)(如下所示)如下 -

  1. 如果我们需要在Program类本身中进行通知,那么我们需要委托。
  2. 在多播委托的帮助下,我们可以同时调用多个函数代替多次调用它们(如我的第二种情况)。

委托是一种将特定方法作为变量引用的方法,这意味着它可以更改,而不是作为最后一个示例,硬编码到程序中调用哪些方法。

没有代表,有没有办法做到这一点? 当然,您可以提供覆盖方法或使用实现接口的类的对象,但是代理在您不需要围绕单个方法的整个类型的意义上更便宜。

硬编码不起作用的情况的例子,接口/覆盖方法比代表更多的工作,尝试查看可视组件及其事件。 .NET中的事件使用委托。 您只需双击Visual Studio中可视化设计器中的按钮,它就会为您创建方法,并通过委托方式将其连接到事件。 必须创建一个类,或者在表单类之上实现一个接口会有很多工作,特别是如果你有多个按钮要做不同的事情,那么你肯定需要多个对象来实现这些接口。

代表们有他们的位置,但你的例子不公平。

这是一个LINQPad示例,它演示了一个方法( DoSomething )最终可以根据提供给它的委托执行不同的操作:

void Main()
{
    DoSomething(msg => Console.WriteLine(msg));

    using (var writer = new StreamWriter(@"d:\temp\test.txt"))
    {
        DoSomething(msg => writer.WriteLine(msg));
    }
}

public delegate void LogDelegate(string message);

public static void DoSomething(LogDelegate logger)
{
    logger("Starting");
    for (int index = 0; index < 10; index++)
        logger("Processing element #" + index);
    logger("Finishing");
}

这将首先登录到控制台,然后重新运行该方法并登录到文件。

在以下情况下使用委托1.使用事件设计模式(事件处理程序)2.A类可能需要方法的多个实现3.Thread实现(线程启动,睡眠等)

有关更多信息,请参阅https://msdn.microsoft.com/en-us/library/ms173173.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM