我遵循有关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)属性AddCommand
,它们只有一个 setter/getter 。在所说的getter中,针对null
测试了addCommand字段。如果是addCommand != null
,则返回其值。否则,将返回RelayCommand
类的新示例。但是,由于AddCommand没有设置程序,包括私有(private)设置程序,这并不意味着addCommand
字段将始终返回null
吗?为什么要针对null
测试始终返回null
的字段?为什么要保留这样一个领域呢? 最佳答案
结果,您可能会丢失C#中的任何赋值都将返回所赋值的部分。
x = 1
返回1这意味着你可以做
y = x = 1
并且y也以1结束,因为x=1
的结果为1并将其分配给y结果,您看到的模式为
addCommand
一次性创建了一个值;如果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;
}
它没有明显更长的时间,并且性能相当,因此,如果您对它有更好的了解,那么它省去了您不必向SO询问的时间,那将永远是赢利:)-有时C#开发人员可能会走得太远寻找某种紧凑的,单行的方式表达意图并最终获得等同于“计算机可读”但不太“人类可读”的东西的探索,如果您一目了然就无法理解它,那可能就没必要了每次来看它都浪费时间关于c# - 为什么在此示例中针对null进行测试?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/66231346/