c# - 接口(interface)作为参数

标签 c# interface

在什么情况下有人会将接口(interface)作为参数传递(或接收)?它真的是一件有用的东西还是只是一种奇特的做事方式?

最佳答案

这是一个非常有用的东西。

任何 LINQ extension methods , 例如。他们不关心传递给他们的是什么,只要它实现了 IEnumerable<T>。 .这个想法是,它们都可以应用于您可以使用 foreach 枚举的任何内容。循环。

想象一下,如果他们都要求您通过 T[],那将是多么毫无意义的限制。数组,或 List<T>对象,例如。


这只是一个非常微不足道的例子。让我们假设 LINQ 扩展不存在(如果我使用 .NET 2.0,这实际上是一种可能性)并且我想写一个 Sum方法。

我可以这样写:

public static double Sum(List<double> values)
{
    double sum = 0.0;
    foreach (double value in values)
    {
        sum += value;
    }
    return sum;
}

一切都很好,但请注意这里的一些事情:我编写了方法来获取 List<double> ,这是一个具有比此代码所依赖的功能多得多的类。它在哪里使用 Insert ?它在哪里使用 RemoveAtFindAllSort ?不,这些都不是必需的。那么这个方法真的有必要通过 List<double> 吗? ?

此外,假设我有一个 double[] .从理论上讲,我应该能够将其作为 values 弹出。参数,因为我所做的只是使用 foreach 枚举它;但自从我输入了 values作为List<double> , 传递 double[]到我的Sum我必须这样做的方法:

double sum = Sum(new List<double>(myArray));

这只是一个完全不必要的新对象,我构建它只是为了调用代码,而这些代码本来就应该能够处理我的原始对象。

通过编写将接口(interface)作为参数的方法,您可以使您的代码更灵活、更强大,并且您可以避免施加不适当的限制(给我一个 X,尽管我可以很容易地用一个 Y) 关于调用代码。

关于c# - 接口(interface)作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3166532/

相关文章:

c# - DataGridView 性能与 BindingList 数据源相结合

c# - 数据集中的大型 XML 文件(内存不足)

go - 接口(interface)指针的奇怪行为

C# 4.0 动态对象和 WinAPI 接口(interface),如 IShellItem(无需在 C# 源代码中定义它们)

c# - 如何通过保留方法名称来扩展接口(interface)?

java - 将 CrudRepository 接口(interface)扩展为基础接口(interface)

c# - 如何使用响应式扩展等待 IObservable<T> 完成而不阻塞 UI?

c# - 停止 Visual Studio 2019,让我在 Debug模式下编辑文件

c# - 如何记录自定义变量

c# - 在 Ruby 中,什么相当于 C# 中的接口(interface)?