我注意到我在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;
}
}