C#当我们将中的类初始化为值时,字典是如何工作的?
假设我有以下代码:C#当我们将中的类初始化为值时,字典是如何工作的?,c#,dictionary,C#,Dictionary,假设我有以下代码: public static Dictionary<string, ViewModelBase> LoadDictionary() { Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>(); tempDictionary.Add("LoginView", new LoginViewModel());
public static Dictionary<string, ViewModelBase> LoadDictionary()
{
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>();
tempDictionary.Add("LoginView", new LoginViewModel());
tempDictionary.Add("SignUpView", new SignUpViewModel());
tempDictionary.Add("ContactListView", new ContactListViewModel());
return tempDictionary;
}
编辑: 我只是想知道
tempDictionary.Add("LoginView", new LoginViewModel());
将被执行并调用LoginView模型构造函数,即使我没有在程序的任何其他部分调用“LoginView”键。注意当您初始化词典时,是的,如果您希望在访问词典时发生这种情况,它将调用视图模型的构造函数,您可以创建类型为
的字典,只需调用一个函数,该函数将返回一个新的ViewModel()=>{newviewmodel();}
在c中初始化字典有几种方法#
public static Dictionary<string, ViewModelBase> LoadDictionary()
{
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>();
tempDictionary.Add("LoginView", new LoginViewModel());
tempDictionary.Add("SignUpView", new SignUpViewModel());
tempDictionary.Add("ContactListView", new ContactListViewModel());
return tempDictionary;
}
publicstaticdictionary LoadDictionary()
{
Dictionary tempDictionary=新字典();
Add(“LoginView”,new LoginView model());
Add(“SignUpView”,新的SignUpViewModel());
添加(“ContactListView”,新的ContactListViewModel());
返回词典;
}
public static Dictionary<string, ViewModelBase> LoadDictionary()
{
return new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
};
}
Dictionary<string, Customer> cList = new Dictionary<string, Customer>()
{
["LoginView"] = new LoginViewModel(),
["SignUpView"] = new SignUpViewModel()
};
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
}
publicstaticdictionary LoadDictionary()
{
返回新字典(){
{“LoginView”,新的LoginView模型(),
{“SignUpView”,新的SignUpViewModel()},
{“ContactListView”,新建ContactListViewModel()}
};
}
注意这是有风险的,因为您可以使用相同的密钥初始化字典,这将导致错误public static Dictionary<string, ViewModelBase> LoadDictionary()
{
return new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
};
}
Dictionary<string, Customer> cList = new Dictionary<string, Customer>()
{
["LoginView"] = new LoginViewModel(),
["SignUpView"] = new SignUpViewModel()
};
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
}
Dictionary cList=newdictionary()
{
[“LoginView”]=新的LoginView模型(),
[“SignUpView”]=新的SignUpViewModel()
};
Dictionary
有一个无参数构造函数,您在这里调用它:
new Dictionary<string, ViewModelBase>();
与任何其他构造函数一样,这将创建该类的新实例
请注意,您所展示的代码中没有一个与类初始值设定项真正相关。集合类型的初始值设定项(如
字典
)可能如下所示:
public static Dictionary<string, ViewModelBase> LoadDictionary()
{
return new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
};
}
Dictionary<string, Customer> cList = new Dictionary<string, Customer>()
{
["LoginView"] = new LoginViewModel(),
["SignUpView"] = new SignUpViewModel()
};
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>() {
{"LoginView", new LoginViewModel()},
{"SignUpView", new SignUpViewModel()},
{"ContactListView", new ContactListViewModel()}
}
Dictionary tempDictionary=new Dictionary(){
{“LoginView”,新的LoginView模型(),
{“SignUpView”,新的SignUpViewModel()},
{“ContactListView”,新建ContactListViewModel()}
}
它被编译成基本上等同于您所拥有的:
Dictionary<string, ViewModelBase> tempDictionary = new Dictionary<string, ViewModelBase>();
tempDictionary.Add("LoginView", new LoginViewModel());
tempDictionary.Add("SignUpView", new SignUpViewModel());
tempDictionary.Add("ContactListView", new ContactListViewModel());
Dictionary tempdirectionary=newdictionary();
Add(“LoginView”,new LoginView model());
Add(“SignUpView”,新的SignUpViewModel());
添加(“ContactListView”,新的ContactListViewModel());
现在还不完全清楚您在这个主题上的困惑是什么,但基本上所有这些代码都是创建对象的实例。是的,临时字典。添加(“LoginView”,new LoginView wmodel());表达式将创建LoginView模型类的新实例,即使您从未尝试访问tempDictionary dictionary对象的LoginView键。退出注释:
@Jonesopolis我只想知道以下代码: 将被执行并调用LoginView模型构造函数,即使我没有在程序的任何其他部分调用“LoginView”键 此代码与以下代码相同:
var vm = new LoginViewModel();
tempDictionary.Add("LoginView, vm);
首先执行构造对象的表达式(newloginviewmodel()
),然后将结果值传递到字典上的Add
方法。因此,是的,您的对象是在被传递到字典之前构造的
您可以自己编写一个非常简单的程序来测试它
我只是想知道这个代码:
tempDictionary.Add("LoginView", new LoginViewModel());
将被执行并调用LoginView模型构造函数,即使我没有在程序的任何其他部分调用“LoginView”键
是的,构造函数在代码中被调用。如果您想延迟加载它们,也可以尝试该类
var deferredConstructionDict = new Dictionary<string, Lazy<ViewModelBase>>();
deferredConstructionDict.Add("LoginView", new Lazy<ViewModelBase>(() => new LoginViewModel()));
deferredConstructionDict.Add("SignUpView", new Lazy<ViewModelBase>(() => new SignUpViewModel()));
deferredConstructionDict.Add("ContactListView", new Lazy<ViewModelBase>(() => new ContactListViewModel()));
原职:
我认为你的问题中有一个根本性的误解,其他答案中没有提到
当我们将中的类初始化为值时,Dictionary
是如何工作的
我相信您所说的“类内”是指您的字典
类型包含一个类型ViewModelBase
,作为第二个泛型类型。字典
类型是泛型类型,在C#中有特殊规则。C#在调用Dictionary
的构造函数时,不会调用类型为t
或U
的构造函数,它只了解有关t
和U
的类型信息,以便运行时知道如何在以后引用字典中存储的对象时处理它们
基本上,泛型类型(在您的例子中,我指的是string
和ViewModelBase
)是运行时的占位符,C#处理它们的方式是当使用泛型时,当您创建泛型类型的实例时,运行库应该能够弄清楚如何处理它们,而不管使用什么类型。这意味着,即使这样做是有意义的,Di