Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#当我们将中的类初始化为值时,字典是如何工作的?_C#_Dictionary - Fatal编程技术网

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中初始化字典有几种方法#

  • 您可以使用正在使用的语法创建字典,然后使用add初始化值

    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());
    返回词典;
    }
    
  • 您可以使用初始值设定项创建它,C#5和更早的方法如下:

    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()}
    };
    }
    
    注意这是有风险的,因为您可以使用相同的密钥初始化字典,这将导致错误

  • 这种在后台调用Add方法的方式更有趣的是,您可以重载Add方法来修改向字典添加内容的方式,这意味着如果您为Add创建一个重载,该重载采用(int,ViewModelBase),并说您在内部调用了int.ToString(),那么您也可以在初始值设定项中使用int

  • 在C#6.0及更高版本中,有一种初始化字典的新方法,如下所示:

    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()
    };
    
  • 使用这种方法的好处是,如果向字典中添加具有相同值的条目,它将覆盖旧值,并且不会导致错误,您可以找到有关它的更多信息

    编译器是否首先创建一个构造函数(无参数构造函数),然后才添加我的KeyValuePairs

    编译器不必创建任何内容
    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