2011-12-23 97 views
19

在C#中,我们必须命名一个接口方法的参数。为什么我们必须命名接口方法参数?

我明白,即使我们没有到,这样做会帮助读者理解其中的含义,但是在某些情况下,它是不是真的需要:

interface IRenderable 
{ 
    void Render(GameTime); 
} 

我会说上面的是可读和有意义的下面:

interface IRenderable 
{ 
    void Render(GameTime gameTime); 
} 

有一些技术原因,都需要一个接口上的方法参数的名字呢?


值得一提的是,接口方法的实现可以使用不同的名称那些在接口的方法。

+0

我认为这将使方法签名名一致! – 2011-12-23 09:22:13

+0

查看我编辑的最新评论。 – 2011-12-23 09:23:19

+1

我所指的就像方法声明在类和接口之间一致... – 2011-12-23 09:27:26

回答

19

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

如果我们使用的是接口,那么指定命名参数值是不可能的。举个例子:

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方法,还是通过类确定是否有默认参数,以及它们的值是什么。

+0

接口在可选参数和命名参数之前存在。 :) – CodeCaster 2015-11-18 21:18:22

+0

@CodeCaster好喊,最有可能不是原来的原因,但它现在肯定是一个原因:)我猜测未来功能的可能性,如这是他们命名它们的原因。 – Lukazoid 2015-11-18 21:32:39

+0

@Lukazoid,做得很好。无论以何种方式来看,这都是最合乎逻辑的答案。 – 2017-07-22 14:48:41

9

我没有看到任何理由会使这成为技术要求。但我可以想到一个特别好的理由:

正如您所说,实现接口时不需要参数名称,并且可以轻松地进行覆盖。
但是,当使用接口时,想象一下如果没有参数具有有意义的名字,那么难度是多少!没有智能,没有提示,只有一种类型?呸。
这一直是名称始终需要的最大原因。

+0

加上它使它与类中的方法声明一致。 – Thilo 2011-12-23 09:32:04

+2

“如果没有参数具有有意义的名字,想象一下难度!” - 只需在Eclipse中编写一些Java,大多数参数名称都显示为“arg0”等等。 – Adam 2011-12-23 09:35:34

+1

@codesparkle这听起来像阅读缩小的JavaScript文件一样有趣! – 2011-12-23 09:49:20

0

好的,这种可能性似乎太过轻浮,但 - 当你让Visual Studio在属性和方法中实现接口和存根时,它知道如何命名参数?

在另一方面,VS没有问题一般命名控制...

1

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

我可以很容易地看到名称自动实现的情况,比如今天自动实现的属性的后备成员。

不过,我认为有可能就是他们一直需要3个主要的原因:

1)这是可能显着更容易实现使用相同的规则实际方法在编译器接口验证。由于只是在最近才引入自动实现的属性,我怀疑这是一个不小的编译器更改。 2)对于那些支持在实现类(即VB)中自动创建接口成员的语言,使用预定义名称创建接口实现可能容易得多,而不是试图快速创建名称。 3)由于接口可以暴露在定义应用程序之外,因此名称可以消除与定义不准的接口相关的不明确性。

例如,试图实现的接口方法:

void Foo(string, string, int) 

将最有可能导致比你的自我记录例如实质上更多的混乱。但是,这实际上更像是一个接口可用性问题,而不是技术问题,但有人可能会争辩说,如果接口不可用,则存在潜在的技术问题。

2

命名接口方法参数应用具有自文档可帮助:

例如...

interface IRenderable 
{ 
    void Render(TimeSpan gameTime); 
} 

...说多:

interface IRenderable 
{ 
    void Render(TimeSpan); 
} 
相关问题