ref out默认值

时间:2014-10-21 05:59:43

标签: c# out ref

我还在努力学习,因为我不认识很多具有良好编程知识的同行,我告诉自己,如果我在互联网上找不到正确的答案,就会开始提出更多关于良好编程习惯的问题。

我想知道这种情况的最佳方法是什么。我有一个函数应该根据一些数据来计算参数。

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)

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

祝你好运!

1 个答案:

答案 0 :(得分:2)

最简单的解决方案(就改变很少的代码而言)就是过载:

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参数指示的所有内容。然后你不需要重载 - 你只需忽略你不感兴趣的结果的任何部分。(这意味着浪费的工作,当然......如果计算其中一条信息是非常昂贵的使用过,您可能想要考虑替代策略。)