如何在三元运算符中向TakeHit函数传递ref参数?
结论:你的写法完全合法且正确
首先明确:你用TakeHit(ref isRed ? ref red : ref blue);这种写法是符合C#语法规范的,而且逻辑上和if-else分支的效果完全一致。
为什么合法?
这是C# 7.0及以后版本支持的ref条件表达式特性:当三元运算符的两个分支都返回ref类型的表达式(且类型兼容,这里都是ref Player),整个表达式就能作为ref参数传递给函数。
效果等价于if-else
这段代码和下面的if-else写法没有任何区别:
if (isRed) { TakeHit(ref red); } else { TakeHit(ref blue); }
函数TakeHit内部对ref Player player的任何修改,都会直接作用到red或blue实例本身,因为传递的是它们的引用。
验证示例
比如给Player加个Health属性,测试一下:
public class Player { public int Health { get; set; } } void TakeHit(ref Player player) { player.Health -= 10; } // 调用代码 Player red = new Player { Health = 100 }; Player blue = new Player { Health = 100 }; bool isRed = true; TakeHit(ref isRed ? ref red : ref blue); Console.WriteLine(red.Health); // 输出90,符合预期
所以你完全可以放心用这种写法,它只是if-else的简洁版而已。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

