Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我必须在实现中再次设置默认值,那么在接口中设置默认值有什么好处?_C#_Interface_Default Value - Fatal编程技术网

C# 如果我必须在实现中再次设置默认值,那么在接口中设置默认值有什么好处?

C# 如果我必须在实现中再次设置默认值,那么在接口中设置默认值有什么好处?,c#,interface,default-value,C#,Interface,Default Value,我已经创建了以下界面 public interface IMineralService { Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue); Task<Mineral> GetMineral(int id); } 公共接口IMineralService { 任务GetMinerals(int page=0,int size=Int32.MaxValue); 任务GetMin

我已经创建了以下界面

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue);
  Task<Mineral> GetMineral(int id);
}
公共接口IMineralService
{
任务GetMinerals(int page=0,int size=Int32.MaxValue);
任务GetMineral(intid);
}
其执行情况如下

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue)
  {
    Mineral[] data = await Task.FromResult(Minerals);
    return data.Skip(page * size).Take(size).ToArray();
  }

  public async Task<Mineral> GetMineral(int id)
  {
    Mineral[] data = await GetMinerals();
    return data.SingleOrDefault(a => a.Id == id);
  }
}
公共类服务:IMineralService
{
公共异步任务GetMinerals(int page=0,int size=Int32.MaxValue)
{
矿物[]数据=等待任务。来自结果(矿物);
返回数据.Skip(page*size).Take(size).ToArray();
}
公共异步任务GetMineral(int-id)
{
矿物[]数据=等待获取矿物();
返回data.SingleOrDefault(a=>a.Id==Id);
}
}
我不明白在构造函数和实现中为参数声明默认值的目的或含义是什么。跳过默认值不会与实现这样的接口相冲突,因此以下操作可以正常工作。Id est-没有将设置的默认值从接口强加到实现上

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page, int size) { ... }
}
public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page, int size);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue)
}
公共接口IMineralService
{
任务GetMinerals(int page=0,int size=Int32.MaxValue);
}
公共类服务:IMineralService
{
公共异步任务GetMinerals(整型页面,整型大小){…}
}
它还可以处理仅在实现中声明的默认值

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page, int size) { ... }
}
public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page, int size);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue)
}
公共接口IMineralService
{
任务GetMinerals(整型页面,整型大小);
}
公共类服务:IMineralService
{
公共异步任务GetMinerals(int page=0,int size=Int32.MaxValue)
}

但是,为了使第二个方法与wait GetMinerals()一起工作,必须在实现中设置默认值。因此,如果必须在实现中重新声明默认值(如果另一个调用使用它),或者根本不需要(如果没有其他调用使用默认值),那么在构造函数中设置默认值有什么意义呢?

设置默认值不会向设置默认值的类添加任何代码来设置这些值。相反,它使得任何调用这些方法而不提供显式值的消费代码实际上都将被编译以传递指定的值

因此,这些可选参数的可选性与方法的实际实现细节分离

这意味着您实现的不同接口可以提供不同的默认值。或者让接口和类具有不同的默认值。或者实现类甚至不指定默认值,但接口的使用者仍然能够调用该类的方法,而不提供显式值

因此,这类似于决定一个类是否应该显式地实现接口方法,而不是隐式地实现接口方法:您需要考虑如何使用您的类和接口

  • 如果您遵循一种方法,其中消费类将作为服务注入您的接口,并且永远不知道支持它的具体类,那么在实现类的方法签名上设置默认值是没有意义的
  • 如果您的接口和类都有某些共同的期望,并且您希望在某些情况下直接使用类,在其他情况下通过接口使用类,那么最好在这两种情况下声明相同的默认值
  • 如果您的接口预期使用不同的默认值,而不是您设想的直接调用您的类的用户的使用情况,那么您可能希望每个接口都有不同的默认值

区别在于您是想调用接口变量的方法,还是想调用类类型的方法<代码>IMineralService var1=。。。;GetMinerals()使用接口中定义的默认值(如果有),并且
MineralService var2=。。。;var2.GetMinerals()
将使用实例方法中声明的默认值。这里@RenéVogt中也有类似的内容,以验证我是否正确理解了您的观点-按照最佳实践,我应该在接口和实现类中设置默认值?那么,我有责任保持它们的同步?