为什么接口定义中需要参数名称?我可以在实现过程中选择新的参数名称

Sea*_*son 15 c#

不确定这是否是一个愚蠢的问题,但我只是注意到了这一点:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long sequence, int count);
}

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao
{        
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

在我的实现中,我调用了第二个参数'maxRecords'.然而,在界面中,它被定义为"计数".编译器仍然认为接口已实现,这很好,但可能会导致一些歧义.显然,我应该重命名其中一个参数以匹配另一个参数.

在重命名之前我玩了一下,发现了一些有趣的东西.我不允许将我的界面声明为:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long, int);
}
Run Code Online (Sandbox Code Playgroud)

这只是编译器对C#语义的过度保护吗?除了使代码更具可读性之外,接口方法中的参数名称的用途是什么?在我看来,如果在实现时不强制参数名称,它会引起歧义.

use*_*940 30

接口声明中需要参数名称,以便于实现和参考.如果有人使用您的界面,方法参数的名称应该是自我记录,因此界面的使用者了解传递给方法的内容(例如,通过IntelliSense查看方法描述时)

是的,当您实现界面时,您可以根据需要为参数命名.

  • 因为您可能希望在实现级别更具体的自我文档.假设您使用方法Execute(int operand1,int operand2)创建了一个IBinaryMathOperation接口.然后,您实现了一个实现该接口的AddOperation类.add方法的"操作数"更具体地称为"加数",您可能希望在Execute()的特定实现中调用它们. (3认同)
  • 好吧,有点.答案虽然清楚,但并没有真正解决我帖子的最后一句话.为什么不能保证在实现过程中参数的名称相同?如果唯一的目的是自我记录并明确 - 为什么不将这种清晰度一直带到实现?当我真的期待'maxResults'时,我不想不小心宣传我的方法接受'计数'. (2认同)

Han*_*ant 8

历史.这可以追溯到.NET的早期阶段,当COM统治世界时.当时能够与COM互动是非常重要的,没有人会抛弃一切来采用全新的编程风格.

这使得COM互操作在.NET中得到了强有力的支持.除了需要为接口方法设置命名参数之外,类型库还需要它们.

有趣的角落案例永远是C++/CLI语言.它采用了许多C++语法规则,包括在声明中省略参数名称的能力.换句话说,这是合法的:

    public interface class IFoo
    {
        void bar(int, long, double);
    };
Run Code Online (Sandbox Code Playgroud)

类型库导出器生成此声明:

    HRESULT bar(
                    [in] long p1, 
                    [in] long p2, 
                    [in] double p3);
Run Code Online (Sandbox Code Playgroud)

如果您在C#类中实现接口,则由IntelliSense自动生成,结果非常相似:

class FooImpl : cpptemp36.IFoo {
    public void foo(int __p1, int __p2, double __p3) {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

这让没人高兴.