C# 避免每次调用构造函数时实例化对象

C# 避免每次调用构造函数时实例化对象,c#,design-patterns,C#,Design Patterns,我有一个PersonViewModel类并绑定了Person用户控件。每当我选择Person Use Control page时,createPersonCommand,deletePersonCommand,viewPersonCommand将始终重新启动。有没有办法一次性创建这些命令?执行InitializePersonCollection方法,因为该方法将从数据库中检索最新日期 我的上级对我的任务发表了评论,他也被提到了 private ICommand createPersonC

我有一个
PersonViewModel
类并绑定了Person用户控件。每当我选择Person Use Control page时,
createPersonCommand
deletePersonCommand
viewPersonCommand
将始终重新启动。有没有办法一次性创建这些命令?执行
InitializePersonCollection
方法,因为该方法将从数据库中检索最新日期

我的上级对我的任务发表了评论,他也被提到了

    private ICommand createPersonCommand;

    public ICommand CreatePersonCommand
    {
        get { return createPersonCommand; }
    }

    private ICommand deletePersonCommand;

    public ICommand DeletePersonCommand
    {
        get { return deletePersonCommand; }
    }

    private ICommand viewPersonCommand;

    public ICommand ViewPersonCommand
    {
        get { return viewPersonCommand; }
    }

    public PersonViewModel()
    {
        createPersonCommand = new DelegateCommand<object>(ExecuteCreatePersonCommand);
        deletePersonCommand = new DelegateCommand<object>(ExecuteDeletePersonCommand);
        viewPersonCommand = new DelegateCommand<object>(ExecuteViewPersonCommand);
        InitializePersonCollection();
    }
private ICommand和createPersonCommand;
公共ICommand CreatePersonCommand
{
获取{return createPersonCommand;}
}
私有ICommand和deletePersonCommand;
public-ICommand-DeletePersonCommand
{
获取{return deletePersonCommand;}
}
私有ICommand viewPersonCommand;
公共ICommand ViewPersonCommand
{
获取{return viewPersonCommand;}
}
公共PersonViewModel()
{
createPersonCommand=新的DelegateCommand(ExecuteCreatePersonCommand);
deletePersonCommand=新的DelegateCommand(已执行eletepersonCommand);
viewPersonCommand=newdelegateCommand(ExecuteViewPersonCommand);
初始化personCollection();
}

只要命令执行方法不是静态的,您就需要这样做。如果出于任何原因,您可以使命令方法
静态
,那么您也可以使您的委托命令
静态
,并且只将静态实例分配给您的成员

但正如人们已经提到的那样,这是没有意义的。您拥有的代码是一个完善的模式。没有理由改变它

也许你应该检查一下命令的位置是否正确。是每个人都需要自己的命令,还是在主视图模型中需要将单个人作为参数的命令?这可能更有意义。

您可以使用“延迟加载”。然后命令将按需实例化,并且不会影响从数据库加载数据的速度

private ICommand createPersonCommand;
public ICommand CreatePersonCommand
{
    get {
        if (createPersonCommand == null) {
            createPersonCommand = new DelegateCommand<object>(ExecuteCreatePersonCommand)
        }
        return createPersonCommand;
    }
}
private ICommand和createPersonCommand;
公共ICommand CreatePersonCommand
{
得到{
if(createPersonCommand==null){
createPersonCommand=新的DelegateCommand(ExecuteCreatePersonCommand)
}
返回createPersonCommand;
}
}

这个问题毫无意义。你为什么要回避它?如果您想避免,只需删除该代码即可。或者更清楚地解释您的问题。您可以将其设置为静态,但我认为每次选择一个人时创建新的DelegateCommand并不是一个大问题(除非您的速度足够快,可以每秒选择1000000人)。这难道不是预期的行为吗?假设每次打开屏幕时都实例化一个新的ViewModel,则还应创建相关的命令,或者这不是你的问题吗?你并不是在一次又一次地创建同一个
DelegateCommand
s-你是在为每个
PersonViewModel
实例创建
DelegateCommand
s,这些实例都与这个特定的
PersonViewModel
实例相关联。例如,
createPersonCommand
将在这个特定的
PersonViewModel
的上下文中运行
ExecuteCreatePersonCommand
。这在WPF应用程序中是毫无意义的,因为它们是在创建XAML时被访问的。@默认情况下,如果您有虚拟化的列表,只有从UI组件(可能是通过绑定)访问该属性,才能访问该属性。