C# 例示字典的最好方法是什么?

C# 例示字典的最好方法是什么?,c#,dictionary,C#,Dictionary,最近,我一直在关注一些关于Unity的教程,希望能进入一些游戏编程。现在,我注意到教程中的家伙执行以下操作将参数复制到变量: private Dictionary<string, Inventory> inventoryRequirements; public Job ( Dictionary<string, Inventory> inventoryRequirements) { this.inventoryRequirements = new Dictiona

最近,我一直在关注一些关于Unity的教程,希望能进入一些游戏编程。现在,我注意到教程中的家伙执行以下操作将参数复制到变量:

private Dictionary<string, Inventory> inventoryRequirements;

public Job ( Dictionary<string, Inventory> inventoryRequirements) {
    this.inventoryRequirements = new Dictionary<string, Inventory>(inventoryRequirements);
}
专用词典目录要求;
公共职务(字典目录要求){
this.inventoryRequirements=新字典(inventoryRequirements);
}
当然,这一切都很好,但我只是想知道这和下面的区别是什么:

private Dictionary<string, Inventory> inventoryRequirements;

public Job ( Dictionary<string, Inventory> inventoryRequirements) {
    this.inventoryRequirements = inventoryRequirements;
}
专用词典目录要求;
公共职务(字典目录要求){
此项。库存要求=库存要求;
}

在第一种情况下,初始化包含从传递给构造函数的字典复制的元素的字典实例,并使用键类型的默认相等比较器。欲了解更多信息,请查看。然后将对新创建的字典的引用分配给
inventoryRequirements
字段


而在第二种情况下,您只需将对原始词典的引用的副本分配给
inventoryRequirements
字段

在第一个示例代码段中,您正在使用复制构造函数克隆作为参数传入的字典实例

而在第二种方法中,您只需将传入的字典引用分配给当前对象字典实例

第一种方法是克隆给定字典数据的有效方法。这意味着修改原始词典时,副本不受影响


也就是说,如果
Inventory
是引用类型(我假设它是引用类型),那么需要注意的是,您已经克隆了字典,但是如果您没有克隆字典实例中的
Inventory
值,对
清单
的任何修改仍将在给定的
作业
实例字典中查看。

好吧,为了真正了解到底发生了什么,让我们看一下快速代码片段

观察输出,您可以看到在第二种情况下,您的原始字典实际上被修改了,映射到键“test”的值被重新分配为0

正如您可能已经了解到的,当您使用
新字典(inventoryRequirements)时您实际上创建了原始词典的克隆,因此实例化的类可以修改其副本,而不会影响副本

然而,当您直接传递同一个字典时,实例化类所做的任何修改都将在您的类中可见,并且您将失去对字典的控制,因为您实际上已经赋予实例化类对它的完全控制权

现在,作为OOP的一般规则,您应该将字段(其他类/对象不需要的字段)留给自己。根据该逻辑,在以下情况下,您应该传递对象(而不是副本):

  • 您将不再需要该对象,或者
  • 您的对象非常大,无法合理克隆请记住,如果您的对象立即超出范围,GC将自动删除它
  • 该对象是一个基本体(您将获得一个深度副本,因此它已经是一个克隆。)

  • 现在,如果你不需要以上任何一个,你可能应该传递一份副本

    当你有这样的问题。所有类型(包括每个构造函数)都有文档记录。