2016-10-03 12 views
3

私はモバイルアプリケーションのクロスプラットフォーム開発用にXamarin Formsを使用してプロジェクトを開始しています。私はMVVMモデルを使用していますが、そのうちのいくつかの小さなWPFアプリケーションの経験はほとんどありません。ICommandインターフェイスの効率的な使用

ICommandインターフェイスを使用してコマンドを作成し、ビューのXAMLにバインドします。デフォルトでは、重複したコードが大量に含まれています。 Xamarin.Formsは、hereという議論のように使われるICommandの具体的なサブタイプCommandを提供しています。私はそれらをインスタンス化する2つの明白な方法を見ています。

オプション#1 - コンストラクタにコマンドを割り当てます。

public class Presenter : ObservableObject 
{ 
    public Presenter() 
    { 
     DoStuffCommand = new Command(DoStuff); 
    } 

    public ICommand DoStuffCommand { get; set; } 

    private void DoStuff() 
    { 
     // VM stuff 
    } 

} 

オプション#2 -

public class Presenter : ObservableObject 
{ 
    public ICommand RunCommand { get { return new Command(DoStuff); } } 

    private void DoStuff() 
    { 
     // VM stuff 
    } 

} 

多くのビューモデルは、コマンドの数を持ってしようとしているゲッターでインスタンス化コマンド、およびアプローチ#2は、コンストラクタで1することにより、これらの1のすべてを割り当てる回避します - コマンドアクションが変更されないときは、このアクションをICommand自体で宣言していることがわかります。一方、これは、コマンドが起動するたびにCommandの新しいインスタンスを作成します。これは、アプローチ#1よりもメモリの効率が低いことは明らかです。

これは誰でも経験したことがありますか、これがパフォーマンスに顕著な影響を与えるかどうかを知ることができますか?コマンドオブジェクトを手動で破棄するなど、これを改善する方法はありますか?

ありがとうございます!

答えて

2

オプション#2の代わりにそれのためのバッキングフィールドを持つようになり、それは一度だけインスタンス化を保証します:

private ICommand _doStuffCommand; 
public ICommand DoStuffCommand => 
    _doStuffCommand = _doStuffCommand ?? new Command(DoStuff); 

private void DoStuff() 
{ 

} 
+0

素晴らしいことだ、ありがとう - 私が探していたまさに。私はこのパターンがより頻繁に使われるのを見たことがありません。 – DGoodman

+0

はい、それは本当に簡単です:) – Cheesebaron

関連する問題