我遵循有关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/

10-17 01:00