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

在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参数。

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

我认为没有任何理由可以将其作为技术要求。 但我能想到一个特别好的理由:

如您所述,实现接口时不需要参数名称,可以轻松覆盖。
但是,在使用界面时 ,如果没有参数具有有意义的名称,请想象难度! 没有intellisense,没有提示,只有一种类型? 呸。
这必须是始终需要名称的最大原因。

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

例如 …

 interface IRenderable { void Render(TimeSpan gameTime); } 

……说的多于:

 interface IRenderable { void Render(TimeSpan); } 

我想不出接口必须定义名称的任何有效技术原因。

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

但是,我认为可能有三个主要原因需要它们:

1)使用与实际方法相同的规则在编译器中实现接口validation可能要容易得多。 由于仅在最近才引入了自动实现的属性,我怀疑这是一个非平凡的编译器更改。

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

3)由于接口可以暴露在定义应用程序之外,因此名称可以消除与定义不明确的接口相关联的歧义。

例如,尝试实现以下接口方法:

 void Foo(string, string, int) 

最有可能导致比你自我记录的例子更多的混乱。 然而,这实际上更多的是接口可用性问题,而不是技术问题,尽管可以说如果接口不可用,则存在潜在的技术问题。

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

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