我如何在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);