在C#中使用数组的场景背后

时间:2011-10-17 19:13:09

标签: c# arrays

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

  1. 如果我创建一个数组new int[10],那么长度属性将保证为10,或者如果我接近填充它,C#会尝试调整数组的大小吗?

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

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

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

7 个答案:

答案 0 :(得分:3)

1)是的,长度为10。

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

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

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

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

答案 1 :(得分:3)

  

如果我创建一个数组new int [10]将保证Length属性为10,或者如果我接近填充它,C#会尝试调整数组的大小吗?

它将是10.总是10。

  

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

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

  

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

  1. 没有
  2. 如果您不知道数组的大小,并且集合必须增长,请改用List<T>。 List在内部使用数组,但List会在必要时负责调整数组的大小。
  3. 列表会根据需要自动增长。你可以设置它的initiali Capacity

答案 4 :(得分:1)

  1. C#创建长度为10的数组,不要调整它的大小。
  2. 您可以使用list,无法调整数组大小。
  3. 是的,您可以设置列表Capacity
  4.   

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

快速肮脏;)

  • 如果我创建一个数组new int [10]将保证Length属性为10,或者如果我接近填充它,C#会尝试调整数组的大小吗?

NO

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

YES

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

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

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