每次在财产获取者中返回新的ICommand是不是很糟糕?

Pom*_*oma 9 .net c# wpf mvvm

编写这段代码是否值得:

RelayCommand _saveCommand;
public ICommand SaveCommand
{
    get
    {
        if (_saveCommand == null)
        {
            _saveCommand = new RelayCommand(this.Save);
        }
        return _saveCommand;
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是每次只返回新对象:

public ICommand SaveCommand
{
    get { return new RelayCommand(this.Save); }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,很少使用命令getter,而RelayCommand的构造函数非常快.编写更长的代码会更好吗?

Fre*_*lad 11

我喜欢null合并运算符

public ICommand SaveCommand 
{ 
    get { return _saveCommand ?? (_saveCommand = new RelayCommand(this.Save); }
}
Run Code Online (Sandbox Code Playgroud)

如果操作数不为null,则返回左侧操作数,否则返回右操作数.


Mar*_*icz 6

这种设计可能会让您的班级用户产生误导.例如,他们可以在循环中读取属性的值,并进行数千次迭代.这将创建许多新对象,用户可能不会期望这样.

请参阅StyleCop警告CA1819的文档:属性不应返回数组 - 这是一个非常类似的问题.

通常,用户不会理解调用此类属性的不利性能影响.具体来说,他们可能会将该属性用作索引属性.

另外,SaveCommand == SaveCommand将是假的.我认为这是违反直觉的.

总而言之,这可能不是最好的设计,但是,如果您的代码的用户知道它是如何工作的以及如何正确使用它,那么它没关系.