使用Action,Func或使用界面时

时间:2012-10-30 07:40:23

标签: .net delegates action func

我在使用Action,Func或在设计类中使用界面时有疑问?

3 个答案:

答案 0 :(得分:0)

接口就像任何实现它的类的契约。它仅包含方法属性事件索引器的签名。

所以它就像一个没有任何代码实现的抽象类。使用界面取决于您想要实现的目标。

基本上,如果你想让不同的类以不同的方式执行代码但必须至少有一些具有相同签名的方法或属性,那么使用interface' s。

例如,您有一个不关心如何记录信息的应用程序(如何实现该类),但您仍希望使用Write方法来调用和发送信息。然后你就可以有这样的界面:

interface ILog
{
    void Write(string message);
}

然后像这样实现它:

class FileLog : ILog
{
    public void Write(string message)
    {
        // Code for logging to file here.
    }
}

class DatabaseLog : ILog
{
    public void Write(string message)
    {
        // Code for logging to a database here.
    }
}

现在,您的应用程序只能使用界面,并且不需要知道它的记录方式:

class MyApplication
{
    ILog _log;

    public MyApplication(ILog log)
    {
        this._log = log;

        // Could be file or database or anything that implements the ILog interface.
        this._log.Write("My application initialized");
    }
}

现在您可以轻松更改记录方式:

ILog log = new FileLog();
var app = new MyApplication(log); // This will now log to file.

ILog log2 = new DatabaseLog();
var app2 = new MyApplication(log2); // This will now log to database.

此外,类不能从多个类继承,但可以实现多个接口,因此您可以拥有多个合同。

您可以阅读有关接口here的更多信息,还可以查看this answer

答案 1 :(得分:0)

首先,ActionFunc在类设计方面基本相同,所以我只想说Func来引用它们。< / p>

如果某个方法接受Func,则说明它需要一个可以执行的方法,以执行某些操作或检索所需的值。这是一种非常轻微耦合的关系,并且该方法的客户端很容易安排满足该参数的参数。

如果一个方法接受一个接口,那么它就会声明对另一个组件的依赖,这可能表明它只需要执行一个方法或读取一个值就需要更多来自该组件。这是一种更紧密耦合的关系,它强制该方法的客户端跳过更多的箍来调用它,因为他们需要构造一个实现接口的类。系统中的每个接口和类都应该是自我对齐的 - 该接口是否代表应用程序业务领域中的真实实体或行为,或者您只是创建一个界面来对某些数据进行分组或者是否需要您的方法?

因此,当在Func和接口之间进行选择时,您应该考虑方法的需求 - 如果它需要来自其客户端的多个数据,并且各个数据块符合一个匹配的整体匹配在域中的一个概念,那么你应该考虑使用一个接口。否则,使用Func代码更少,更容易编写,并且对客户端的要求更少。

答案 2 :(得分:0)

我不确定为什么要关联代理和界面。

什么是代表?

委托是可以存储方法地址的对象。它非常类似于c的函数指针,但委托更安全。

什么是Action和Func?

每当你想使用委托时,你总是需要定义委托并在你使用它之前创建它的新实例。

delegate void MyDelegate();
MyDelegate d = new MyDelegate(p.InstanceMetshod);
d();

通过引入action和func,您可以使代码更短更清晰。相同的代码可以重写如下

Action methodCall = p.InstanceMetshod;
methodcall();

您可以轻松查看代码的简短程度。您可以获得与之前相同的功能。

可以对返回void并接受零个或多个参数的方法使用Action(仍有限制) Func可用于返回特定类型并接受零个或多个参数的方法(仍有限制)

另一方面,

Interfaces是contract。如果你想实现一个接口,你就必须遵守它的协议。