C# 是否有理由在接口中声明可选参数?

C# 是否有理由在接口中声明可选参数?,c#,c#-4.0,optional-parameters,C#,C# 4.0,Optional Parameters,您可以在接口方法中声明可选参数,但不需要实现类将参数声明为可选参数,如下所示。相反,可以在实现类中将参数声明为可选参数,但在接口中不能 那么,有没有理由在接口中声明可选参数呢?如果没有,为什么允许这样做 示例: public interface IService1 { void MyMethod(string text, bool flag = false); } public class MyService1a : IService1 { public void MyMeth

您可以在接口方法中声明可选参数,但不需要实现类将参数声明为可选参数,如下所示。相反,可以在实现类中将参数声明为可选参数,但在接口中不能

那么,有没有理由在接口中声明可选参数呢?如果没有,为什么允许这样做

示例:

public interface IService1
{
    void MyMethod(string text, bool flag = false);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) {}
}

public class MyService1b : IService1
{
    public void MyMethod(string text, bool flag = true) { }
}

public interface IService2
{
    void MyMethod(string text, bool flag);
}

public class MyService2b : IService2
{
    public void MyMethod(string text, bool flag = false) { }
}

它很有用,因为接口可以按照它想要的方式声明它们,因此您可以在创建接口时获得您想要的确切灵活性。换句话说,派生类中的实现者可以根据需要将参数设置为可选的、必需的等等。如果它不是可选的,则派生类必须具有它


上面的示例显示了派生类的灵活性。

这样做的原因是,当调用方拥有的编译时类型只是接口时,调用方可以更容易地使用它:

public void Foo(IService1 service)
{
    service.MyMethod("Text"); // Calls MyMethod("Text", false)
}

调用方只知道某个实现的接口而不知道具体类型是很常见的,因此如果您认为可选参数是一个好主意(这是有争议的)将它们放在接口上和放在具体类型上一样有意义。

接口设计者对默认参数的假设可能与实现者的设计不同

默认参数由编译器简单地展开,并由实际的默认值替换

当您对作为接口实例的对象调用方法时,编译器将替换接口上指定的默认值

当您对类的实例对象调用方法时,编译器将替换类上指定的默认值

示例:

public interface IService1
{
    void MyMethod(string text, bool flag = true);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) { }
}
用法:

IService1 ser = new MyService1a();
ser.MyMethod("A");

传递给
MyService1a
的第二个参数将是
true
,作为接口中的默认参数。

如果一个接口的设计方法
Foo
采用参数
Bar
,99%(但不是100%)对
Foo
的调用为
Bar
传递零,则必须:

  • Include in the interface method重载包含参数'Bar',也不包含参数'Bar',因此要求该接口的每个实现都包含一个额外的方法,但使调用方无需指定它。
  • 只包含一个包含“Bar”的方法,这样可以为实现者节省额外方法的成本,但要求在每个调用站点都包含一个额外的参数。
  • 将参数定义为接口中的可选参数,从而使实现者和使用者都更加方便。 选项#3在可行的情况下对我来说似乎最方便。

    似乎是以下两个选项的重复: