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组件(可能是通过绑定)访问该属性,才能访问该属性。