C# 我应该使用struct而不是class将项目放入字典中吗

C# 我应该使用struct而不是class将项目放入字典中吗,c#,class,dictionary,struct,value-type,C#,Class,Dictionary,Struct,Value Type,我有一个自定义实体类(参见下面的代码)。此类的对象被填充到字典集合Dictionary dt。有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中。好的,我认为在这种情况下类似乎是更好的选择,因为字典将只包含对Entity类型的对象的引用。在本例中,实体类型表示csv文件中的一行。因此,对于每一行,都会有一个实体类型的对象。实体类型中的封装字典包含键、值对(表示列)和csv文件中某行的值 但我想确保我没有错过任何明显的东西,所以我想最好还是问一下 public class E

我有一个自定义实体类(参见下面的代码)。此类的对象被填充到字典集合
Dictionary dt
。有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中。好的,我认为在这种情况下类似乎是更好的选择,因为字典将只包含对Entity类型的对象的引用。在本例中,实体类型表示csv文件中的一行。因此,对于每一行,都会有一个实体类型的对象。实体类型中的封装字典包含键、值对(表示列)和csv文件中某行的值

但我想确保我没有错过任何明显的东西,所以我想最好还是问一下

 public class Entity
    {
        Dictionary<string, string> dtValues = new Dictionary<string,string>(); //contains values    from CSV file.
        public Dictionary<string, string> Values
        {
          get { return dtValues; }
          set { dtValues = value; }
        }

    }
公共类实体
{
Dictionary dtValues=new Dictionary();//包含CSV文件中的值。
公共字典值
{
获取{返回dtValues;}
设置{dtValues=value;}
}
}
有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中

那个人大错特错了。简单地说:字典本身在堆上,所以它的内容也在堆上

如果您不确定是应该使用引用类型还是值类型,那么您应该研究两者的利弊(我列出了一些)。但您可能应该使用引用类型

记住:过早优化是万恶之源

有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中

那个人大错特错了。简单地说:字典本身在堆上,所以它的内容也在堆上

如果您不确定是应该使用引用类型还是值类型,那么您应该研究两者的利弊(我列出了一些)。但您可能应该使用引用类型

记住:过早优化是万恶之源

有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中

那个人大错特错了。简单地说:字典本身在堆上,所以它的内容也在堆上

如果您不确定是应该使用引用类型还是值类型,那么您应该研究两者的利弊(我列出了一些)。但您可能应该使用引用类型

记住:过早优化是万恶之源

有人要求我使用Struct而不是Class,因为值类型不会被复制到堆中

那个人大错特错了。简单地说:字典本身在堆上,所以它的内容也在堆上

如果您不确定是应该使用引用类型还是值类型,那么您应该研究两者的利弊(我列出了一些)。但您可能应该使用引用类型


记住:过早优化是万恶之源。

使用结构字典总是一个非常糟糕的主意,因为当你枚举它或用它的值做任何事情时,你会一次又一次地复制数据,所以使用类是正确的方法,以这种方式,只移动引用。

使用结构字典始终是一个非常糟糕的主意,因为当您枚举它或使用它的值执行任何操作时,您将一遍又一遍地复制数据,因此使用类是正确的方法,以这种方式,只移动引用。

使用结构字典始终是一个非常糟糕的主意,因为当您枚举它或使用它的值执行任何操作时,您将一遍又一遍地复制数据,因此使用类是正确的方法,以这种方式,只移动引用。

使用结构字典始终是一个非常糟糕的主意,因为当您枚举它或使用它的值执行任何操作时,您将一遍又一遍地复制数据,因此使用类是正确的方法,以这种方式,只移动引用。

为封装状态而保存对可变对象的引用的类型通常应避免将这些对象暴露给外部代码。我不太明白您的
实体
类型的目的是什么,因为唯一明显的内容是对
字典的引用
[当然,这是一种可变类型]

一般来说,如果希望在集合中存储对象,并试图决定使用类还是结构来存储对象,我建议如下:

public class ExposedFieldHolder<T>
{
  public T Value;
  ExposedFieldHolder(T value) { Value = value; }
}
  • 如果对列表项或字典值[非键]使用可变类类型,则可以编辑存储在项中的信息,而无需将集合本身包含在该过程中。但是,要使项目中包含的信息可供外部代码使用,则需要克隆数据项目或将数据从该项目复制到其他项目中

  • 如果对存储在集合中的对象使用不可变类类型或任何结构类型,则编辑项中包含的信息将需要读取该项,生成更改的版本,然后将其存储回去。但是,使项目中包含的信息可供外部代码使用会容易得多,因为可以将其作为自己的数据类型返回

  • 有时有用的模式是定义可变结构类型,然后定义包装器类型,如下所示:

    public class ExposedFieldHolder<T>
    {
      public T Value;
      ExposedFieldHolder(T value) { Value = value; }
    }
    
    但这可能仍然比不可变类或所谓的“不可变”结构所需要的要好,例如

    var temp = myDict["George"];
    temp = new PersonDat(temp.Name, temp.Age+1, temp.FavoriteColor, temp.AstrologicalSign);
    myDict["George"] = temp;
    
    请注意,如果在使用公开的字段结构时始终遵循前一种模式,则无论该结构包含哪些字段或属性或它们的出现顺序如何,代码都是正确的。相比之下,当使用后一种模式时,必须非常小心,以确保不应更改其值的任何字段或属性以正确的顺序传递给构造函数。有些人可能喜欢这种代码;我想