gpt4 book ai didi

c# - Returnvalue with ref 与两个 out Values 相比

转载 作者:行者123 更新时间:2023-11-30 16:46:30 25 4
gpt4 key购买 nike

我今天和一个同事讨论过,关于如何最好地返回两个值。我们产生了三种不同的意见。这个问题很重要,我们不能使用额外的类或结构(因此没有元组),这是这个问题的首选答案:Clean Code - Are output parameters bad? .

public enum Offset
{
None = 0,
Training = 10,
Cancel = 20
}

static void Main(string[] args)
{
//Option 1
int outValue = 0;
Offset outOffset;
HandleOffset(35, out outValue, out outOffset);

//Option 2
int refValue = 0;
outOffset = SubtractOffset(ref refValue);

//Option 3
outOffset = GetOffsetById(35);
int id = GetIdWithoutOffset(35);
}

//Option 1
public static void HandleOffset(int inValue, out int outValue, out Offset outOffset)
{
outValue = inValue;
outOffset = Offset.None;
if ((inValue-(int)Offset.Cancel)>15)
{
outValue -= (int)Offset.Cancel;
outOffset |= Offset.Cancel;
}
if ((inValue - (int)Offset.Training) > 15)
{
outValue -= (int)Offset.Training;
outOffset |= Offset.Training;
}
}

//Option 2
public static Offset SubtractOffset(ref int id)
{
Offset offset = Offset.None;
if ((id - (int)Offset.Cancel) > 15)
{
id -= (int)Offset.Cancel;
offset |= Offset.Cancel;
}
if ((id - (int)Offset.Training) > 15)
{
id -= (int)Offset.Training;
offset |= Offset.Training;
}
return offset;
}

//Option 3
public static Offset GetOffsetById(int id)
{
Offset offset = Offset.None;
if ((id - (int)Offset.Cancel) > 15)
{
offset |= Offset.Cancel;
}
if ((id - (int)Offset.Training) > 15)
{
offset |= Offset.Training;
}
return offset;
}

//Option 3
public static int GetIdWithoutOffset(int id)
{
if ((id - (int)Offset.Cancel) > 15)
{
id -= (int)Offset.Cancel;
}
if ((id - (int)Offset.Training) > 15)
{
id -= (int)Offset.Training;
}
return id;
}

选项 2 看起来很丑,因为返回值 + ref 值。

因为有两个输出参数,选项 1 看起来也很丑,但实际上它看起来比第二个选项干净。

选项 3 在我看来是最干净的。

哪些解决方案被认为是最干净的解决方案(干净如 bob martin 所说的干净代码),或者是否有我们可能没有想到的其他解决方案来解决问题?

最佳答案

一般来说,最干净的解决方案是不需要任何 outref 参数的解决方案(最好是结构/类,元组也可以)。由于不允许使用类/结构或元组,这是首选方式,因此我仍然会使用第一个选项,因为它最简单。

在我看来,第二个选项完全是胡说八道,因为 out-关键字应该完全按照您的要求执行,所以根本不需要使用 ref必要的。

第三个选项还可以,尽管非常困惑且不那么容易。由于您不能使用元组并希望维护清晰的代码,因此请避免使用它。

TL;DR:使用第一个选项。

关于c# - Returnvalue with ref 与两个 out Values 相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com