我如何在C#中初始化一个空数组?

有没有可能创build一个空数组而不指定大小?

例如,我创build了:

String[] a = new String[5]; 

我们可以创build没有大小的上述string数组吗?

如果你打算使用一个你不知道大小的集合,那么比数组有更好的select。

使用List<string>代替 – 它将允许您根据需要添加尽可能多的项目,如果您需要返回数组,则需要在variables上调用ToArray()

 var listOfStrings = new List<string>(); // do stuff... string[] arrayOfStrings = listOfStrings.ToArray(); 

如果你必须创build一个空数组,你可以这样做:

 string[] emptyStringArray = new string[0]; 

尝试这个:

 string[] a= new string[] { }; 

在.Net 4.6中,首选的方法是使用一个新的方法Array.Empty

 String[] a = Array.Empty<string>(); 

实现是简洁的,使用generics类中的静态成员如何在.Net中performance :

 public static T[] Empty<T>() { return EmptyArray<T>.Value; } // Useful in number of places that return an empty byte array to avoid // unnecessary memory allocation. internal static class EmptyArray<T> { public static readonly T[] Value = new T[0]; } 

(为清楚起见,删除了代码合同相关代码

也可以看看:

  • 参考源上的Array.Empty源代码
  • Array.Empty<T>()
  • Marc Gravell – Allocaction,Allocation,Allocation – 我最喜欢的贴子。

你可以初始化它的大小为0,但是当你知道大小是什么时,你将不得不重新初始化它,因为你不能附加到数组。

 string[] a = new string[0]; 

声明没有大小的数组没有太大的意义。 一个数组是关于大小 。 当你声明一个特定大小的数组时,你可以指定一个可以容纳东西的集合中可用的固定数量的槽,并相应地分配内存。 要添加一些东西,你需要重新初始化现有的数组(即使你调整数组的大小, 看到这个线程 )。 在你想要初始化一个空数组的情况下,一个罕见的情况是将数组作为parameter passing。

如果你想定义一个集合,当你不知道可能的大小时,数组不是你的select,而是像List<T>或类似的东西。

也就是说,声明一个没有指定大小的数组的唯一方法是拥有一个大小为0的空数组。 Hemant和Alex Dn提供了两种方法。 另一个更简单的select是只是

 string[] a = { }; 

[ 括号内的元素应该可以隐式转换为定义的types,例如string[] a = { "a", "b" }; ]

还有另一个:

 var a = Enumerable.Empty<string>().ToArray(); 

这是一个更具说明性的方式

 public static class Array<T> { public static T[] Empty() { return Empty(0); } public static T[] Empty(int size) { return new T[size]; } } 

现在你可以打电话给:

 var a = Array<string>.Empty(); //or var a = Array<string>.Empty(5); 

你可以做:

 string[] a = { String.Empty }; 

注意:OP意味着不必指定一个大小,而不是一个数组没有规模

您可以在运行时定义数组大小

这将允许你做任何dynamic计算数组的大小。 但是,一旦定义大小是不可改变的。

 Array a = Array.CreateInstance(typeof(string), 5); 

据我所知你不能没有大小的数组,但你可以使用

 List<string> l = new List<string>() 

然后l.ToArray()

简单而优雅!

 string[] array = {} 

结合@nawfal和@Kobibuild议:

 namespace Extensions { /// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary> public static class Array<T> { public static readonly T[] Empty = new T[0]; } } 

用法示例:

 Array<string>.Empty 

HTH

这是一个真实世界的例子。 在这里有必要初始化数组foundFiles首先为零长度。

(正如在其他答案中强调的那样:这不是初始化一个元素,特别是不是索引为零的元素,因为这意味着该数组的长度为1。

如果省略了part = string[0] ,则会出现编译器错误!

这是因为catch块没有rethrow。 C#编译器识别代码path,函数Directory.GetFiles()可以抛出一个exception,以便数组可以被初始化。

之前有人说,不重新抛出exception将是错误的处理错误:这是不正确的。 error handling必须符合要求。

在这种情况下,假设程序应该继续以防止无法读取的目录,而不是破坏 – 最好的例子是遍历目录结构的函数。 这里的error handling只是logging它。 当然,这可以做得更好,例如收集列表中失败的GetFiles(Dir)调用的所有目录,但是这会导致太远。

只要避免throw是一个有效的场景就足够了,所以数组必须初始化为零。 在catch块中这样做就足够了,但是这样做会很糟糕。

调用GetFiles(Dir)调整数组大小。

 string[] foundFiles= new string[0]; string dir = @"c:\"; try { foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero } // Please add appropriate Exception handling yourself catch (IOException) { Console.WriteLine("Log: Warning! IOException while reading directory: " + dir); // throw; // This would throw Exception to caller and avoid compiler error } foreach (string filename in foundFiles) Console.WriteLine("Filename: " + filename); 

我曾尝试过:

 string[] sample = new string[0]; 

但我只能插入一个string,然后我得到一个exceptionOutOfBound错误,所以我只是简单地把它的大小,像

 string[] sample = new string[100]; 

或者另一种方式为我工作:

 List<string> sample = new List<string>(); 

为列表分配值:

 sample.Add(your input);