ref out default values

本文关键字:values default out ref | 更新日期: 2023-09-27 18:27:12

我仍在努力学习,由于我不认识很多有良好编程知识的同龄人,我告诉自己,如果我在互联网上找不到正确的答案,就开始问更多关于良好编程实践的问题。

我想知道这种情况下最好的方法是什么。我有一个函数,它应该根据一些数据对参数进行计数。

private float CountAvailability(DateTime startDate, DateTime endDate, string machine)
{
      float value=0;
      float machineUptime = _repostory.Select(machine);
      float machineDownTime = _repostory2.Select(machine);
      value = machineUptime *machineDownTime ;
      //some other magic here
      return value;
}

关于coruse,这是一个示例代码,实际上它要复杂得多。

现在,我已经在代码中的其他几个地方使用了这个函数,现在还需要从中传递一些其他参数。我不想在其他地方再计算它们,我也不想重复我的代码来创建该函数的副本,所以我考虑使用ref或out。

private float CountAvailability(DateTime startDate, DateTime endDate, string machine,
                                ref float machineUptime , ref float machineDownTime )
{
      float value=0;
      float machineUptime = _repostory.Select(machine);
      float machineDownTime = _repostory2.Select(machine);
      value = machineUptime *machineDownTime ;
      //some other magic here
      return value;
}

现在我可以从函数中获得一些其他参数。唯一的问题是我不想在我使用函数的每个地方都这样做。

有些地方就像这个

CountAvailability(tempStartDate, tempEndDate, machine , ref machineUptime, ref  machineDownTime )

而在其他情况下,功能应该保持不变。

CountAvailability(tempStartDate, tempEndDate, machine)

但我必须传递一个空的已声明浮点值才能使其工作。有其他方法可以让它发挥作用吗?或者可能还有另一种更清洁的解决方案?

致以最良好的问候!

ref out default values

最简单的解决方案(就更改很少的代码而言)是有一个重载:

private float CountAvailability(DateTime startDate, DateTime endDate, string machine)
{
    float ignored1 = 0f, ignored2 = 0f;
    return CountAvailability(startDate, endDate, machine, ref ignored1, ref ignored2);
}

但是,您应该设置这些out参数,而不是ref参数,因为您没有使用现有的值。

您还应该考虑将方法更改为类似的方法

private Availability GetAvailability(DateTime startDate, DateTime endDate,
                                     string machine)

其中Availability将包括您当前使用返回值和out参数指示的所有内容。然后你就不需要过载了-你只需要忽略你不感兴趣的结果中的任何部分