【问题标题】:Setting a dictionary key as an object type将字典键设置为对象类型
【发布时间】:2012-12-31 19:49:45
【问题描述】:

可以将字典的键设置为引用类型吗?字典是存储这些对象的引用还是存储对象实例? 我有一本字典,我正在存储列表是否加载为布尔值;如果它真的存储海量的列表,那就麻烦了。

public Dictionary<object, bool> isloaded; 

【问题讨论】:

  • 当您不想仅通过引用进行比较时,您需要使用自定义类型作为键来实现GetHashCode。为什么需要Object 作为键而不是强类型键?
  • 基于此:msdn.microsoft.com/en-us/library/xfhwa508.aspx 他们的密钥可以是任何类型。从技术上讲,字符串是引用类型,它们经常用作键。但是我认为一个键应该是强类型的

标签: c# .net list generics pass-by-reference


【解决方案1】:

是的,没关系。

字典存储引用;它不会复制实例。

请注意,如果关键对象是可变的并且以它们的哈希码会改变的方式发生变化,这可能会出现问题。另请注意,无论用作键的引用类型是什么,它们的GetHashCode() 方法都应该有一个有意义的实现。

【讨论】:

    【解决方案2】:

    完全没问题 - 它只存储引用,而不是副本。

    但是,您必须注意,在插入密钥对象后,您不要更改密钥对象的任何用于计算密钥的 GetHashCode() 的字段。

    这是因为对象的 GetHashCode() 用于生成整数键,该键在内部用作键。显然,如果在插入密钥后情况发生了变化,那么它将出现在错误的位置,并且会发生坏事。

    (我个人认为你应该只使用不可变对象作为键。)

    【讨论】:

    • +1,因为您以相同的顺序想到了与我在回答中所做的相同的问题 ;-)
    • 这不是意见问题...存储在哈希表中的项目(即Dicitonary&lt;TK,TV&gt; 应该始终是不可变的,或者至少,参与相等/哈希的属性应该是不可变的。未能观察到这一点的后果是通过改变键来破坏字典变得微不足道。
    • 我的“对象”在执行期间永远不会被重建。我想这不会是一个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多