提问人:Daniel Novák 提问时间:11/1/2022 最后编辑:phuclvDaniel Novák 更新时间:11/5/2022 访问量:91
是否有与 Python :=(赋值表达式)等效的 C#?
Is there a C# equivalent to the Python := (an assignment expression)?
问:
我喜欢它如何节省线路。例:
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# 等效项,或者它需要在之前在行上使用变量赋值?
答:
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)
GetPlace
out
TryGetPlace
)
public bool TryGetPlace(string rule, out string place)
设置为一个值,如果成功则返回,如果不成功则返回,然后按如下方式使用它:place
true
false
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)
评论