gpt4 book ai didi

c# - 为什么在这个例子中针对 null 进行测试?

转载 作者:行者123 更新时间:2023-12-03 10:55:51 25 4
gpt4 key购买 nike

我按照本教程了解 MVVM 中的命令:
https://metanit.com/sharp/wpf/22.3.php
这是教程中命令的示例代码

private RelayCommand addCommand;
public RelayCommand AddCommand
{
get
{
return addCommand ??
(addCommand = new RelayCommand(obj =>
{
Phone phone = new Phone();
Phones.Insert(0, phone);
SelectedPhone = phone;
}));
}
}:
据我了解逻辑,我们有一个私有(private)的支持字段 addCommand和公共(public)属性(property) AddCommand它只有一个 setter/getter 。在所说的 getter 中,字段 addCommand 是针对 null 进行测试的。 .如果 addCommand != null然后返回它的值。否则为 RelayCommand 的新示例类被返回。但是由于 AddCommand 没有 setter ,包括私有(private)的,这不意味着 addCommand字段将始终返回 null ?为什么要针对 null 进行测试将始终返回 null 的字段?为什么要保留这样一个字段?

最佳答案

因此,您可能会错过 C# 中任何赋值都返回所赋值的部分

x = 1
返回 1
这意味着你可以做
y = x = 1
y 也以 1 结束,因为 x=1 的结果是 1,这被分配给 y
因此,您看到的模式为您的 addCommand 提供了一次值(value)创造。 ;如果 addCommand有一个值,则返回现有值,如果没有(即它是 null ),则返回 ??确保执行分配的右侧: addCommand接收一个新值,然后将其作为“赋值的结果”返回(最终作为 get 的结果返回)。这个 addCommand然后存活到下一次调用它,这意味着它的创建只完成一次,并且在第一次需要时而不是默认情况下在创建封闭类时完成(我们称之为延迟加载/延迟实例化..)
private int x = null;

//if x is not null return x otherwise return: (assign 1 to x and return 1)
get { return x ?? (x = 1); }

脚注:
您可能会考虑将代码重构为:
get
{
if(addCommand == null){
addCommand = new RelayCommand(obj =>
{
Phone phone = new Phone();
Phones.Insert(0, phone);
SelectedPhone = phone;
}
}

return addCommand;
}
它并没有显着延长,而且它的性能相当,所以如果你能更好地理解它,那么它为你节省的时间将永远是利润:) - 有时 C# 开发人员可能会走得太远寻求一些紧凑的单行方式来表达意图并最终得到同样“计算机可读”但不太“人类可读”的东西,如果你不能一眼就理解它可能是不必要的每次来看都是浪费时间

关于c# - 为什么在这个例子中针对 null 进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66231346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com