c#中接口的正确方法

本文关键字:方法 接口 | 更新日期: 2023-09-27 17:54:54

我已经创建了一个界面,看起来像这样:

interface ICsvReader
{
    List<string> ReadFromStream(Stream csvStream);
}

我的问题是关于返回类型List<string>。在教程中,我可以看到很多方法只是void的例子。在这种情况下,界面看起来很自然:

interface ILogger
{
    void LogError(string error);
}

您没有任何特定的日志记录目的地或如何记录错误的方法。就像我说的,对我来说这看起来很自然,但是具体的返回类型呢?这不是坏方法吗?当我使用接口时,我想在我的方法上创建一些抽象——"你应该这样做,但我不在乎怎么做"。你对文件阅读器的接口有什么更好的想法吗?我想从不同的来源读取CSV,但总是返回List<string>。好方法还是坏方法?

c#中接口的正确方法

Logger是一种writer所以void;ICsvReader顾名思义,它是reader,意思是它会为你阅读一些东西,并给予它作为回报。

你见过返回类型为void的read方法吗?我想不起来了!

我唯一能建议的是使用IEnumerable<string> 总是承诺少于你能交付的。这将帮助您在将来需要时切换到延迟执行。

这里没有任何问题。由于Logger确实写操作,它是void,这不是你的情况,你需要产生一些东西说"这是我为你读的"。

那么,返回List<string>意味着您在内存中拥有整个结构。对于大于2g的CSV文件,这可能不合适。

另一种选择是返回IEnumerable<string>——这将让csv阅读器决定是想要一次读取整个文件,还是进行增量加载和解析。或者你可以有两个不同的类,一个会尝试一次加载整个文件,另一个会一步一步地工作。

当然,List<T>IEnumerable<T>没有的方法和属性,所以你必须决定这种增加的灵活性是否值得。但是我已经看到许多服务器端插件将读取巨大的文件到内存中,以便将它们发送给客户端,所以我建议至少考虑一下。

关于接口中void和List返回类型

我认为你采取的方法是完全正确的。在您的情况下,您返回的列表不是不正确的,实际上这是您的应用程序的需要。要做到这一点,你需要声明接口。接口方法声明可以是任何适合您代码的内容。正如这里建议的许多答案一样,为了代码优化的目的,使用IEnumerable。从问题:

你对文件阅读器的接口有什么更好的想法吗什么东西吗?

只是建议,你真的需要创建接口吗?因为在你的例子中ReadFromStream方法的定义看起来是一样的,所以你最终可能会在不同的类中编写相同的代码。解决方案将是在基类/抽象类中编写方法(您将在其中实现抽象)

相关文章: