【问题标题】:Behind the Scenes with Arrays in C#C# 中数组的幕后花絮
【发布时间】:2011-12-09 13:07:54
【问题描述】:

C# 处理数组的方式与 C 或 C++ 大不相同。尽管它们确实具有固定的大小,但它将它们视为一件事的对象。所以我对 C# 中的数组有一些疑问:

  1. 如果我创建一个数组new int[10],是否会保证 Length 属性为 10,或者如果我快要填满它,C# 是否会尝试调整数组的大小?

  2. 如果我需要调整数组的大小,我是否必须创建一个更大的新数组,然后复制数组中的每个元素,或者我可以简单地添加更多空间而不复制元素。

编辑:看起来您可以使用 Array.Copy 复制数组。

  1. C# 中的 List 集合看起来像一个动态大小的数组(可能是数组和链表的混合)。如果我使用列表而不是数组,我可以控制它的大小吗? (即强制它的长度为 10,如果我需要更多空间,则将其大小设置为 20)

【问题讨论】:

  • 对#2 使用 Array.Resize 而不是 Array.Copy。我相信它确实会在下面做一个副本。
  • 如果我有一个未完全填充的数组(例如 {1, 2, null, 4, null} ), Array.Resize 除了调整大小或保留空格外,还会压缩它(只需在末尾添加更多插槽)。
  • @jtfairbank,该数组填充。假设数组是int?[],它恰好填充了null。 (数组int[] 将填充0,元素不能容纳null)。
  • @jtfairbank 不,它会将null 值保留在那里。无论如何,“插槽”将是默认值(T),在引用类型中表示null

标签: c# arrays


【解决方案1】:

1) 是的,长度为 10。

2) 是的,您必须创建另一个并复制成员。 Array 类为此提供了一种方法,但您无法避免复制。

3) 列表确实更方便。您可以通过添加或删除成员来控制其长度(计数)。

因此,数组在 C# 中的使用频率较低。我们更喜欢List<T> 类(可以在幕后使用数组)。但它们确实会产生一些开销。

将数组用于低级或固定大小的问题。也没有好的(快速)多暗列表类。

【讨论】:

    【解决方案2】:
    1. 是的,这样定义的数组具有固定大小。
    2. 是的,如果你想扩展你必须创建一个新数组
    3. 是的,您可以指定一个初始容量,所有值都初始化为存储类型的默认值。自动扩展。

    【讨论】:

    • 关于#3:这个答案可以解释为设置初始容量也会将值初始化为该容量,这是不正确的。容量和内容是相关的,因为容量必须至少大到足以容纳内容。但是,设置初始容量并不意味着内容已预先填充且可用。例如,var list = new List<int>(10); int willThrowException = list[9]; 索引 9 超出范围。
    【解决方案3】:
    1. 没有
    2. 如果您不知道数组的大小,并且集合必须增长,请改用List<T>。 List 在内部使用数组,但 List 会在必要时调整数组的大小。
    3. 列表将根据需要自动增长。不过,您可以将其设置为初始 Capacity

    【讨论】:

      【解决方案4】:
      1. C# 创建长度为 10 的数组并且不调整它的大小。
      2. 可以使用列表,但不能调整数组大小。
      3. 是的,您可以设置列表Capacity

      容量是 List(Of T) 可以存储的元素数量 在需要调整大小之前,而 Count 是元素的数量 实际上在 List(Of T) 中。

      【讨论】:

        【解决方案5】:

        数组的大小是固定的。如果要更改数组的大小,请分配一个新数组,然后使用 Array.Copy(或 Array.Resize)将项目复制到其中。

        如果您经常这样做,建议改用List<T>。这将为您处理所有调整大小。您可以在创建列表时指定初始容量,但如果添加的容量超过容量,则后备数组会自动调整大小以适应额外的项目。

        【讨论】:

          【解决方案6】:

          快和脏;)

          • 如果我创建一个数组 new int[10] 是否会保证 Length 属性为 10,或者如果我快要填满它,C# 是否会尝试调整数组的大小?

          没有

          • 如果我需要调整数组的大小,我是否必须创建一个更大的新数组,然后复制数组中的每个元素,或者我可以简单地添加更多空间而不复制元素。

          是的

          • C# 中的 List 集合看起来像一个动态大小的数组(可能是数组和链表的混合)。如果我使用列表而不是数组,我可以控制它的大小吗? (即强制它的长度为 10,如果我需要更多空间,则将其大小设置为 20)

          如果您在没有容量的情况下构建列表,它将会增长。您可以使用构造函数设置最大大小...

          List<string> list = new List<string>(10);
          

          【讨论】:

            【解决方案7】:

            如果我创建一个数组 new int[10] 是否会保证 Length 属性为 10,或者如果我快要填满它,C# 是否会尝试调整数组的大小?

            会是 10。总是 10。

            如果我需要调整数组的大小,我是否必须创建一个更大的新数组,然后复制数组中的每个元素,或者我可以简单地添加更多空间而不复制元素。

            您需要调整它的大小并进行复制。有一些帮助方法可以使这更容易,例如Array.Resize - 但不要误会它正在创建一个新数组并使用Array.Copy 将所有内容放在那里。如果您需要可调整大小的集合,请使用List&lt;T&gt;

            C# 中的 List 集合看起来像一个动态大小的数组(可能是数组和链表的混合)。如果我使用列表而不是数组,我可以控制它的大小吗? (即强制它的长度为 10,如果我需要更多空间,则将其大小设置为 20)。

            大小是自动控制的。它会在需要时增长。有一个构造函数重载来接受初始大小。在内部,它还使用一个在需要时调整大小的数组。当它被填满时;它以当前容量的两倍增长,并复制列表中新底层数组中的所有内容。但所有这些魔法都发生在幕后。如果要手动调整List&lt;T&gt; 的内部数组大小,请将Capacity 属性设置为项目数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-09-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-10-20
              • 1970-01-01
              • 2017-05-03
              相关资源
              最近更新 更多