为什么我们必须命名接口方法参数

本文关键字:接口 方法 参数 我们 为什么 | 更新日期: 2023-09-27 18:18:44

在c#中,我们必须为接口的方法的参数命名。

我明白,即使我们不需要这样做,这样做也会帮助读者理解意思,但在某些情况下,这是不必要的:

interface IRenderable
{
    void Render(GameTime);
}

我想说,上面的内容和下面的一样可读且有意义:

interface IRenderable
{
    void Render(GameTime gameTime);
}

是否有一些技术性的原因为什么需要接口上方法的参数名?


值得注意的是,接口方法的实现可以使用不同于接口方法中的名称

为什么我们必须命名接口方法参数

一个可能的原因是使用了可选参数。

如果使用接口,则不可能指定命名参数值。一个例子:

interface ITest
{
    void Output(string message, int times = 1, int lineBreaks = 1);
}
class Test : ITest
{
    public void Output(string message, int numTimes, int numLineBreaks)
    {
        for (int i = 0; i < numTimes; ++i)
        {
            Console.Write(message);
            for (int lb = 0; lb < numLineBreaks; ++lb )
                Console.WriteLine();
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        ITest testInterface = new Test();
        testInterface.Output("ABC", lineBreaks : 3);
    }
}

在本实现中,在使用接口时,timeslineBreaks都有默认参数,因此如果通过接口访问,可以使用默认参数,如果没有命名参数,我们将无法跳过times参数而只指定lineBreaks参数。

仅供参考,取决于您是通过接口还是通过类访问Output方法,确定默认参数是否可用,以及它们的值是什么

我看不出有任何理由使这成为技术需求。但我能想到一个特别好的理由:

正如您所提到的,在实现接口时不需要参数名,并且可以很容易地覆盖参数名。
然而,当使用接口时,想象一下如果没有参数具有有意义的名称将会有多困难!没有智能感知,没有暗示,只有一个类型?恶心。
这就是为什么总是需要一个名字的最大原因。

命名接口方法参数有助于自我文档:

interface IRenderable
{
    void Render(TimeSpan gameTime);
}

…表示多于:

interface IRenderable
{
    void Render(TimeSpan);
}

我想不出任何合理的技术理由说明接口必须定义名称。

我可以很容易地看到这样一种情况:名称是自动实现的,就像今天自动实现属性的支持成员一样。

然而,我认为可能有三个主要原因,为什么他们已经被需要:

1)在编译器中使用与实际方法相同的规则来实现接口验证可能要简单得多。由于自动实现的属性是最近才引入的,我怀疑这是一个重要的编译器更改。

2)对于那些支持在实现类中自动创建接口成员的语言(例如VB),使用预定义的名称创建接口实现可能比尝试动态创建名称要容易得多。

3)由于接口可以在定义的应用程序之外公开,因此名称消除了与定义不清的接口相关的歧义。

例如,尝试实现一个接口方法

void Foo(string, string, int)

很可能导致比您的自文档示例更多的混乱。然而,这实际上更多的是一个界面可用性问题,而不是技术问题,尽管有人可能会争辩说,如果界面不可用,则存在潜在的技术问题。

好吧,这种可能性似乎太无聊了,但是——也许当你让Visual Studio在属性和方法中实现接口和存根时,它知道如何命名参数?

另一方面,VS一般命名控件没有问题…

相关文章: