首頁 > 後端開發 > C++ > 在 ICommand 實作中使用自訂委託是避免重複實例化的最佳方法嗎?

在 ICommand 實作中使用自訂委託是避免重複實例化的最佳方法嗎?

Barbara Streisand
發布: 2025-01-20 17:21:11
原創
825 人瀏覽過

Is Using Custom Delegates in an ICommand Implementation the Best Approach for Avoiding Repeated Instantiation?

MVVM 中的 ICommand 實作:避免重複實例化

問題:

為了避免重複建立 ICommand 實例,我嘗試使用自訂委託來實作 ICommand 類別。此類別包含兩個委託:OnExecute(void 委託,接受 object 參數)和 OnCanExecute(bool 委託,接受 object 參數)。

程式碼如下:

<code class="language-csharp">public class TestCommand : ICommand
{
    public delegate void ICommandOnExecute(object parameter);
    public delegate bool ICommandOnCanExecute(object parameter);

    private ICommandOnExecute _execute;
    private ICommandOnCanExecute _canExecute;

    public TestCommand(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod)
    {
        _execute = onExecuteMethod;
        _canExecute = onCanExecuteMethod;
    }

    //...
}</code>
登入後複製

這種方法有效,但我對其實現的合理性以及是否存在更好的方法存疑。

解:

這種方法與常用的 RelayCommand 模式非常相似,RelayCommand 是一種更成熟、更最佳化的解決方案。

RelayCommand 實作:

<code class="language-csharp">public class RelayCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public RelayCommand(Predicate<object> canExecute, Action<object> execute)
    {
        _canExecute = canExecute;
        _execute = execute;
    }

    //...
}</code>
登入後複製

使用方法:

<code class="language-csharp">public class MyViewModel
{
    private RelayCommand _doSomething;

    public ICommand DoSomethingCommand
    {
        get
        {
            return _doSomething ??= new RelayCommand(
                p => this.CanDoSomething(),
                p => this.DoSomeImportantMethod());
        }
    }
}</code>
登入後複製

使用 null-coalescing assignment (??=) 確保只建立一次 RelayCommand 實例。

參考:

透過使用 RelayCommand 或類似的預先建置實現,可以避免自訂委託帶來的額外複雜性,並獲得更簡潔、更可靠的程式碼。

以上是在 ICommand 實作中使用自訂委託是避免重複實例化的最佳方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板