基于布尔值将两个变量中的一个设置为某个值的更简洁的方法



我注意到我在C#代码中经常使用这种模式。(如果重要的话,它在Unity脚本中。(

if (someBoolean) {
firstVar = 10;
} else {
secondVar = 10;
}

我的问题很简单——有没有办法让这个图案比五行占用更少的空间?甚至可能使其内联?我认为三元运算符可能会这样做,就像…

(someBoolean ? firstVar : secondVar) = 10;

但很快就发现,C#中的三元运算符并不是这样工作的。

我还考虑在静态类中创建某种全局函数,我可以简单地将适当的变量传递给它,但它是经常重复的模式,而不一定是操作。所以函数方法不适用于我在其他地方重复这种模式的地方,使用不同的操作,比如…

if (anotherBoolean) {
thirdVar += exampleVar;
} else {
fourthVar += exampleVar;
}

当然,我可以这么做。。。

if (someBoolean) { firstVar = 10; } else { secondVar = 10; }

但这有点恶心,不是吗?不管怎样,我都非常感谢你能提供的任何建议。非常感谢。

只需使用if/else。你——我指的是我——想得太多了。

您可以使用Destructuring赋值(C#7(将其转换为单个语句:

(firstVar, secondVar) = someBoolean ? (10, secondVar) : (firstVar, 10);

它是否比简单的if更具表达力还有待商榷,但它至少给了你一个陈述。如果项目的其余部分积极使用"破坏"和新的C#7+功能,这可能是一个不错的选择。

与建议使用带有ref参数的辅助函数不同,破坏可以用于数组、列表和属性:

(list[0], list[1]) = someBoolean  ? (list[0], 10) : (10, list[1]);
(x.SomeProp, x.OtherProp) = someBoolean  ? (x.SomeProp, 10) : (10, x.OtherProp);

如果这种情况经常发生,您也可以使用扩展方法。

class Program
{
static void Main(string[] args)
{
var firstVar = 1;
var secondVar = 2;
true.SetValue(ref firstVar, ref secondVar);
false.SetValue(ref secondVar, ref secondVar);
Console.Read();
}
}
public static class BoolExtensions
{
public static void SetValue(this bool bVal, ref int first, ref int second)
{
if (bVal)
first = 10;
else
second = 10;
}
}

最新更新