【问题标题】:Performance of adding entries to a static dictionary at runtime在运行时向静态字典添加条目的性能
【发布时间】:2015-01-05 19:56:46
【问题描述】:

在阅读静态字典时,我注意到由于它们是静态的,因此内存中只有一个副本,但您仍然可以从中添加和删除。这样做对性能有何影响?我假设可能有一个,因为整个字典可能会被复制到内存中。这是正确的还是只是一种误解?

另外,如果是,它会在内存中复制到哪里?它会成为该类的成员,还是该类的所有实例都可以访问所做的更改,而不仅仅是进行修改的实例?

【问题讨论】:

  • 听起来你在这里有很多的误解。添加/删除到静态字典的工作方式与普通字典一样,static 仅表示它与该类的实例无关,而是与static“实例”相关联。你能澄清一下你在问什么吗?

标签: c# performance memory dictionary


【解决方案1】:

正如 Bradley 所说,您可能对 C# 的工作原理存在更深、更根本的误解。也就是说,在我看来,您的问题相当清楚,因为您已经表达了与该问题相关的误解,并允许它们得到解决。

  1. 最重要的是直接回答您的问题:不,与实例字段引用的字典对象相比,使用静态字段引用的字典对象并没有真正的性能差异。
  2. 作为引用类型(即class)的字典对象,无论它在哪里被引用,如果没有明确的代码声明,将永远不会被“复制到内存中”。 所有引用类型对象都是如此,而不仅仅是字典。
  3. 被静态字段引用后,任何有权访问该字段的代码都可以访问这样的字典(即取决于该字段的可访问性,privateprotectedinternal 等),并且对字典对象的任何修改对于有权访问该对象的所有代码都是可见的。请注意,如果有权访问该字段的代码将对象引用传递给无权访问该字段的代码,则即使无权访问该字段的代码仍将看到该对象,包括对其所做的任何修改。这就是引用类型的工作原理。

上面的答案可能只会对您提出更多问题,因为它们可能与您对 C# 工作方式的某些先入之见相冲突,现在您必须解决这些冲突。我鼓励您从 MSDN 上的 C# 教程和文档开始,尤其是与引用类型如何工作以及内存管理如何工作相关的那些。一旦你纠正了你在这些领域的误解,上述答案就会更有意义,你对这些事情如何运作的整体理解也会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2011-12-30
    • 2010-10-11
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多