关于c#:ref out默认值

ref out default values

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

我想知道这个场景的最佳方法是什么。我有一个函数,它应该根据一些也计算在内的数据来计算一个参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

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

有些地方像这样

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

在其他方面,功能应该保持不变。

1
CountAvailability(tempStartDate, tempEndDate, machine)

但我必须通过一个空的已声明的浮点才能使其生效。有没有其他方法让这个工作?或者可能还有其他更清洁的解决方案?

最好的问候!


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

1
2
3
4
5
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参数,因为您不使用现有值。

您还应该考虑将该方法更改为如下内容:

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

其中Availability将包括您当前用返回值和out参数指示的所有内容。那么你不需要一个超负荷——你只需要忽略你不感兴趣的结果的任何部分。(这意味着浪费工作,当然……如果计算那些未使用的信息中的一条很昂贵,那么您可能需要考虑其他策略。)