最近 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 liuliuliuliu PRO 没有 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 liuliuliuliu PRO |
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(),不知道有没有短路求值的效果。 |