是否可以在不指定大小的情况下创建一个空数组?
例如,我创建了:
String[] a = new String[5];
我们可以创建没有大小的上述字符串数组吗?
是否可以在不指定大小的情况下创建一个空数组?
例如,我创建了:
String[] a = new String[5];
我们可以创建没有大小的上述字符串数组吗?
Answers:
如果要使用事先不知道其大小的集合,则有比数组更好的选择。
使用List<string>
代替-这将允许您添加尽可能多的项目,你需要,如果你需要返回一个数组,调用ToArray()
该变量。
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
如果必须创建一个空数组,可以执行以下操作:
string[] emptyStringArray = new string[0];
string[]
没有元素。如果您尝试访问emptyStringArray[0]
,则将获得IndexOutOfRangeException
尝试这个:
string[] a = new string[] { };
int[] variable = new int[]{}
,当在诸如foreach (var s in variable){ Console.WriteLine(s);}
代码之类的循环中编写和使用它时,代码将编译为:int[] args1 = new int[0];
和foreach (int num in args1){Console.WriteLine(num);}
。因此,使用new int[0]
和new int[]{}
将两者编译为同一代码之间应该没有区别。
var
,尽管仅适用于局部变量(不适用于字段)。但是,在C#2.0(Visual Studio 2005)和更早版本中,您必须使用此答案(或string[] a = new string[0];
)的语法。
在.NET 4.6中,首选方法是使用新方法Array.Empty
:
String[] a = Array.Empty<string>();
在实现简洁,使用泛型类的静态成员如何在.net中的行为:
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>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
并没有建立一个数组。它返回对预分配数组的引用。
声明没有大小的数组没有多大意义。一个数组大约是size。声明特定大小的数组时,请在集合中指定可容纳事物的固定可用插槽数,并相应地分配内存。要向其中添加一些内容,无论如何您都需要重新初始化现有的数组(即使您要调整数组的大小,也请参见此线程)。您想初始化一个空数组的罕见情况之一是将array作为参数传递。
如果要在不知道集合的大小的情况下定义集合,则数组不是您的选择,而是类似a List<T>
或类似的东西。
就是说,声明数组而不指定大小的唯一方法是拥有一个大小为0的空数组。hemant和Alex Dn提供了两种方法。另一个更简单的选择是:
string[] a = { };
[ 括号内的元素应隐式转换为定义的类型,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[] array = {}
array
改为just a
,array
大写时作为关键字。将关键字名用作变量名只是一种不好的做法-即使大小写不同也是如此。与我的答案基本相同,除了我String.Empty
在那里。
a
不好?
您可以在运行时定义数组大小。
这将允许您执行任何操作来动态计算阵列的大小。但是,一旦定义大小是不可变的。
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
结合@nawfal和@Kobi建议:
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
更新2019-05-14
(归功于@Jaider ty)
更好地使用.Net API:
public static T[] Empty<T> ();
https://docs.microsoft.com/zh-cn/dotnet/api/system.array.empty?view=netframework-4.8
适用于:
.NET Core:3.0预览版5 2.2 2.1 2.0 1.1 1.0
.NET Framework:4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET标准:2.1预览版2.0 1.6 1.5 1.4 1.3
...
高温超导
arr = Array.Empty<string>();
你可以做:
string[] a = { String.Empty };
注:OP意味着不必指定大小,而不是让一个数组没有尺寸
specify
大小,也可以不创建数组sizeless
。
这是一个真实的例子。在这种情况下,必须foundFiles
首先将数组初始化为零长度。
(如在其他答案中所强调的:这不会初始化元素,尤其是不会初始化索引为零的元素,因为这将意味着数组的长度为1。此行之后的数组长度为零!)。
如果= string[0]
省略该部分,则存在编译器错误!
这是因为捕获块没有被重新抛出。C#编译器识别代码路径,该函数Directory.GetFiles()
可以引发Exception,以便可以对数组进行未初始化。
在任何人说之前,不抛出异常将是错误的错误处理:这不是事实。错误处理必须符合要求。
在这种情况下,假定程序在目录无法读取且不中断的情况下应继续执行-最佳示例是遍历目录结构的函数。这里的错误处理只是记录它。当然,这样做可以做得更好,例如,将所有包含失败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);