c# - C#中的简单组合是什么

标签 c# delegates

根据 MSDN ,建议在需要简单组合时使用委托(delegate)。 谁能举例说明什么是Easy Composition

最佳答案

一个例子会有所帮助。

假设您有一个需要输出一些日志消息的类,并且您想使用构造函数依赖注入(inject)为该类提供一种记录消息的方法。

您有多种选择,包括:

  1. 向类构造函数传递一个接口(interface),其中包含用于记录消息的方法。
  2. 将直接记录消息的委托(delegate)传递给类构造函数。

界面可能看起来像这样:

public interface Log
{
    void WriteLine(string message);

    // ... Other methods
}

因此类可能看起来像这样:

public sealed class MyClass
{
    readonly ILog _log;

    public MyClass(ILog log)
    {
        _log = log;
    }

    public void Test()
    {
        _log.WriteLine("Test() called");
    }
}

这个类现在耦合到 ILog 接口(interface),在构造它时,您必须提供一个实现 ILog 的对象。

如果您改用委托(delegate),类可能如下所示:

public sealed class MyClass
{
    readonly Action<string> _writeLogLine;

    public MyClass(Action<string> writeLogLine)
    {
        _writeLogLine = writeLogLine;
    }

    public void Test()
    {
        _writeLogLine("Test() called");
    }
}

现在该类不再耦合到ILog,在构造它时您可以将任何与委托(delegate)匹配的方法传递给它:

var myClass = new MyClass(Console.WriteLine);

这使得 MyClass 的组合更容易 - 因此 Easy composition

关于c# - C#中的简单组合是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41544382/

相关文章:

c# - 如何检查字符串是否是有效的 HTTP URL?

c# - 有人可以向我解释 WPF 事件的这种奇怪行为吗?

ios - 简单的 iOS 委托(delegate)/回调

c# - 使用 c# 将委托(delegate)传递给非托管代码中的回调函数

objective-c - NSMutableArray 返回 NULL

c# - 有没有办法通过委托(delegate)直接调用属性 setter ?

c# - Windows 8 空白应用 + DEP0700 错误

c# - IPEndPoint 对象的比较不起作用

javascript - 使用服务器绑定(bind)时,如何从 Kendo 网格选定行获取数据?

c# - 如何在 List<T> 中找到未定义字符串的索引