【问题标题】:Memory performance IList<T> vs List<T> property内存性能 IList<T> 与 List<T> 属性
【发布时间】:2020-01-09 01:26:30
【问题描述】:

我正在编写一个类,其中我有一个 A 类对象的集合,并且我正在编写一个类似于 Dictionary&lt;TKey,TValue&gt;.TryGetValue(TKey,TValue) 的函数

看起来和这个很相似:

public class MyCollection
{
   public List<A> Collection {get; set;} = new List<A>();

   public bool TryGetPropertyAByPropertyB(string pPropertyB, out string pPropertyA)
   { … }
}

我只是想知道如果我用 IList 替换 List,它会更有效(谈论内存)吗?

public class MyCollection
{
   public IList<A> Collection {get; set;} = new List<A>();

   public bool TryGetPropertyAByPropertyB(string pPropertyB, out string pPropertyA)
   { … }
}

【问题讨论】:

  • 不 - 无论您将其称为 List&lt;T&gt; 还是 IList&lt;T&gt;,它都将是相同的 List 实例
  • IList 只是一个接口,没有任何实现。你在比较苹果和大众汽车。
  • 这能回答你的问题吗? List<T> or IList<T>
  • 您需要一路回过头来问自己 1) 是否需要关心内存,以及 2) 如果需要,您打算如何识别实际问题。随机挑选一些代码并想知道选项 A 或选项 B 是否会使用更多内存会适得其反地浪费时间——即使答案是“是”,您仍然不知道实际影响。
  • 也许有趣的是(谁知道),如果您 foreach 处理数据,会有 不同,因为 foreach 是如何实现的(鸭子打字,自定义迭代器等);但大多数时候:没有区别

标签: c#


【解决方案1】:

不,List&lt;T&gt; 类型的引用和 IList&lt;T&gt; 类型的引用具有完全相同的大小,usually 32 or 64 bits depending on the target platform's architecture

在这两种情况下,您都在创建 new List&lt;T&gt;。存在于堆上的实际对象的类型不依赖于分配给它的引用的类型。您可以说object x = new List&lt;T&gt;(),它仍然是在“某处”创建的List&lt;T&gt; 的功能齐全的实例,即使您只持有object 类型的引用。

听听您是如何想到它可以有所作为会很有趣?也许您需要阅读 C#/.NET 的基础知识,从引用类型和值类型开始?

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types http://www.albahari.com/valuevsreftypes.aspx

【讨论】:

  • 表示引用本身基本上就是一个指针。 32 位操作系统为 32 位,64 位操作系统为 64 位。被引用的对象的大小更复杂。我同意引用是一样的,但是对IList做了改变,对象的大小不能更轻量级吗?
  • 谢谢,听起来有道理,不过如果你做 object x = new List() 你会失去 List 的一些特性,难道这种损失与内存释放有关吗?跨度>
  • @CarlosPozos 你可以随时用(List&lt;T&gt;) x 将它重铸回List&lt;T&gt;
  • @CarlosPozos 将List&lt;T&gt; 引用为对象或接口对运行时类型或运行时类型的内存使用没有影响。它仍然是一个列表。它在内存方面的唯一区别是引用本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多