最近 Unity DOTS 进入 LTS 了,想试一试,平时 C#用得少,全凭 IDE 硬写,初始化常量遇到了这样的问题,如 Rust 中:
let a = if <slow operation A> {
1
} else if <slow operation B> {
2
} else {
3
};
(注:Rust 不带mut
默认是常量)
没有这个功能的话,a 就得声明成 mutable ,然后在条件分支里面改,或者用一长串?:?:。 用 C++的时候是用一个临时的 lambda ,在条件里 return 。
const int i = [&]() {
if (<slow operation A>)
return 1;
else if (<slow operation A>)
return 2;
else
return 3;
}();
看 V 站经常有人说 C#功能大杂烩,有没有好一点的办法?
1
nikenidage1 2023-07-02 19:35:21 +08:00
没有 if 赋值这样,但是你可以模式匹配,觉得如何?
var tempInFahrenheit = 10; var tempText = tempInFahrenheit switch { (> 32) and (< 212) => "liquid", < 32 => "solid", > 212 => "gas", 32 => "solid/liquid transition", 212 => "liquid / gas transition", }; |
2
geelaw 2023-07-02 19:35:42 +08:00 via iPhone
需要 if 而不是 ?: 的本质原因应该是计算 true/false 分支必须用多条语句完成,而不是条件的快慢。
C# 里也可以用匿名委托、lambda 表达式像 C++ 那样实现复杂初始化 readonly 局部变量,但性能堪忧。 |
3
nikenidage1 2023-07-02 19:35:46 +08:00
|
4
LaTero OP @nikenidage1
@geelaw 谢谢,用 pattern matching 大部分时候是可以的,但是假如两个函数 f(), g()都很慢,用 if else 可以短路,pattern matching 的话似乎必须要都求值然后放进 tuple 里才能 match. 不过好像也可以用 case guard, ``` 0 switch { 0 when f() => 1, 0 when g() => 2, _ => 3, }; ``` 虽然有点丑。 |
5
LaTero OP @nikenidage1 想了一下,可以反向匹配,用 true 去匹配 f()和 g(),不知道有没有短路求值的效果。
|