在C#中,我们必须命名接口方法的参数。
我明白,即使我们没有这样做,这样做也会有助于读者理解其含义,但在某些情况下并不是真的需要:
interface IRenderable
{
void Render(GameTime);
}
我想说上面的内容与下面一样可读且有意义:
interface IRenderable
{
void Render(GameTime gameTime);
}
是否有一些技术理由为什么需要界面上方法参数的名称?
值得注意的是,接口方法的实现可以使用与接口方法中不同的名称。
答案 0 :(得分: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);
}
}
在这个实现中,当使用接口时,times
和lineBreaks
上有默认参数,所以如果通过接口访问,可以使用默认值,没有命名参数,我们会无法跳过times
参数并仅指定lineBreaks
参数。
只是一个FYI,取决于您是通过界面还是通过类访问Output
方法,确定默认参数是否可用,以及它们的值是什么。
答案 1 :(得分:11)
我认为没有任何理由可以将此作为技术要求。但我能想到一个特别好的理由:
如您所述,实现界面时不需要参数名称,可以轻松覆盖
但是,当使用界面时,如果没有参数具有有意义的名称,请设想难度!没有intellisense,没有提示,只有一种类型?呸。
这必须是始终需要名称的最大原因。
答案 2 :(得分:3)
命名界面方法参数有助于自我记录:
例如......
interface IRenderable
{
void Render(TimeSpan gameTime);
}
...说的不止:
interface IRenderable
{
void Render(TimeSpan);
}
答案 3 :(得分:1)
我无法想到接口必须定义名称的任何有效技术原因。
我很容易看到名称是自动实现的情况,就像今天自动实现属性的支持成员一样。
但是,我认为可能有三个主要原因需要它们:
1)使用与实际方法相同的规则在编译器中实现接口验证可能要容易得多。由于仅在最近才引入了自动实现的属性,我怀疑这是一个非平凡的编译器更改。
2)对于那些支持在实现类(即VB)中自动创建接口成员的语言,使用预定义的名称创建接口实现可能比尝试动态创建名称要容易得多。
3)由于接口可以暴露在定义应用程序之外,因此名称可以消除与定义不明确的接口相关的歧义。
例如,尝试实现以下接口方法:
void Foo(string, string, int)
与您的自我记录示例相比,最有可能导致更多的混淆。然而,这实际上更多的是接口可用性问题,而不是技术问题,尽管可以说如果接口不可用,则存在潜在的技术问题。
答案 4 :(得分:0)
好吧,这种可能性几乎看起来太无聊了,但是 - 也许是这样当你让Visual Studio在属性和方法中实现接口和存根时,它知道如何命名参数?
另一方面,VS一般命名控件没有问题...