是否有与 Python :=(赋值表达式)等效的 C#?

Is there a C# equivalent to the Python := (an assignment expression)?

提问人:Daniel Novák 提问时间:11/1/2022 最后编辑:phuclvDaniel Novák 更新时间:11/5/2022 访问量:91

问:

赋值表达式 Python 3.8

我喜欢它如何节省线路。例:

for rule in rules:
    place = getPlace(rule)
    if place:
        print(f"Apply rule {rule.__name__} -> {place}")
        return place
raise Exception('No rule found!')

↓↓

for rule in rules:
    if place:= getPlace(rule):
        print(f"Apply rule {rule.__name__} -> {place}")
        return place
raise Exception('No rule found!')

是否有 C# 等效项,或者它需要在之前在行上使用变量赋值?

python c# 表达式 赋值运算符

评论

1赞 rotgers 11/1/2022
没有。下面的问题问了同样的问题:stackoverflow.com/questions/18467203/......在这个答案中,stackoverflow.com/questions/6559274/...Rand.Function 展示了一种巧妙的方法,但不应使用,因为它令人困惑。
1赞 Fildor 11/1/2022
用 C# 编写时,你为什么要用 Python 思考?首先,您的 C# 代码是什么样子的?

答:

2赞 MindSwipe 11/1/2022 #1

好吧,没有完美的 1:1 匹配,但在您的情况下,您可以使用

foreach (var rule in rules)
{
    string place;
    if ((place = GetPlace(rule)) != null)
    {
        Console.WriteLine($"Found {place}");
        return place;
    }
}

这是一个演示。在 C# 中很少使用,一种更习惯的方法是使返回值为指示成功的布尔值和类似的参数(命名约定也会告诉我们命名此方法((place = GetPlace(rule)) != null)GetPlaceoutTryGetPlace)

public bool TryGetPlace(string rule, out string place)

设置为一个值,如果成功则返回,如果不成功则返回,然后按如下方式使用它:placetruefalse

foreach (var rule in rules)
{
    if (TryGetPlace(rule, out var place))
    {
        Console.WriteLine($"Found {place}");
        return place;
    }
}

评论

2赞 phuclv 11/1/2022
它并不“晦涩难懂”,因为赋值已经是 C#(以及 C、C++ 和许多其他类 C 语言)中的表达式。在 C 语言中,使用类似while ((c = getchar()) != EOF)
1赞 Fildor 11/1/2022
您也可以使用“模式”......bool GetPlace( string rule, out string place )
2赞 MindSwipe 11/1/2022
@phuclv我在 C# 中将其归类为晦涩难懂,因为您几乎从未在 C# 中看到它,也许“在 C# 中很少使用”更准确
1赞 MindSwipe 11/1/2022
@Fildor我同意,虽然这更接近 OP 编写的 Python 代码,但惯用的 C# 方式 (IMO) 是bool TryGetPlace(string rule, out string place)