【发布时间】:2012-02-02 08:54:12
【问题描述】:
是否可以创建一个空数组而不指定大小?
例如,我创建了:
String[] a = new String[5];
我们可以创建上面没有大小的字符串数组吗?
【问题讨论】:
-
stackoverflow.com/questions/151936/…你检查这个链接,它可以帮助你清楚地理解数组的东西
标签: c# arrays initialization
是否可以创建一个空数组而不指定大小?
例如,我创建了:
String[] a = new String[5];
我们可以创建上面没有大小的字符串数组吗?
【问题讨论】:
标签: c# arrays initialization
如果您要使用事先不知道大小的集合,则有比数组更好的选择。
改用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>();
implementation 简洁,使用how static members in generic classes behave in .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];
}
(为清楚起见,删除了与代码合同相关的代码)
另见:
【讨论】:
Enumerable.Empty<T>().ToArray()
Array.Empty<T>() 不 创建一个数组。它返回对预分配数组的引用。
EmptyArray<T> 是一个单独的类,而不是让它成为Array<T> 的一部分?
你可以用 0 的大小初始化它,但是当你知道它的大小时,你必须重新初始化它,因为你不能追加到数组中。
string[] a = new string[0];
【讨论】:
声明一个没有大小的数组没有多大意义。数组大小差不多。当你声明一个特定大小的数组时,你指定了一个集合中可以容纳东西的固定数量的可用槽,并相应地分配内存。要添加一些东西,无论如何您都需要重新初始化现有数组(即使您正在调整数组大小,see this thread)。您想要初始化一个空数组的罕见情况之一是将数组作为参数传递。
如果您想在不知道它可能有多大大小的情况下定义一个集合,则数组不是您的选择,而是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 更改为a,因为array 是大写的关键字。将关键字名称用作变量名称只是不好的做法 - 即使大小写不同。基本上和我的回答一样,除了我在里面有String.Empty。
a 不好?
string[] a = new string[0];
或简称:
string[] a = { };
现在首选的方式是:
var a = Array.Empty<string>();
我写了一个简短的正则表达式,如果你想替换零长度分配,你可以在 Visual Studio 中使用它,例如new string[0]。
在 Visual Studio 中使用 Find(搜索)并打开正则表达式选项:
new[ ][a-zA-Z0-9]+\[0\]
现在 Find All 或 F3(查找下一个)并将所有替换为 Array.Empty() !
【讨论】:
您可以在运行时定义数组大小。
这将允许您做任何事情来动态计算数组的大小。但是,一旦定义,大小是不可变的。
Array a = Array.CreateInstance(typeof(string), 5);
【讨论】:
int i = 5; string[] a = new string[i];
我试过了:
string[] sample = new string[0];
但我只能在其中插入一个字符串,然后我得到一个 exceptionOutOfBound 错误,所以我只是简单地为其设置一个大小,比如
string[] sample = new string[100];
或者其他适合我的方式:
List<string> sample = new List<string>();
为列表赋值:
sample.Add(your input);
【讨论】:
据我所知,你不能制作没有大小的数组,但你可以使用
List<string> l = new List<string>()
然后是l.ToArray()。
【讨论】:
结合@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/en-us/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 框架:4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET Standard:2.1 预览版 2.0 1.6 1.5 1.4 1.3
...
HTH
【讨论】:
arr = Array.Empty<string>();
您可以使用Array.Empty 方法(至少在.Net Core 中)
string ToCsv(int[] myArr = null) { // null by default
// affect an empty array if the myArr is null
myArr ??= Array.Empty<int>();
//... do stuff
string csv = string.Join(",", myArr);
return csv;
}
【讨论】:
你可以这样做:
string[] a = { String.Empty };
注意:OP 意味着不必指定大小,而不是创建数组 sizeless
【讨论】:
specify 一个大小,不必创建一个数组sizeless。
这是一个真实的例子。在此需要先将数组foundFiles 初始化为零长度。
(正如其他答案中所强调的:这不会初始化一个元素,尤其是索引为零的元素,因为这意味着数组的长度为 1。该数组在这一行之后的长度为零!)。
如果= string[0]部分省略,则编译错误!
这是因为没有重新抛出的 catch 块。 C# 编译器识别代码路径,函数Directory.GetFiles() 可以抛出异常,因此可以未初始化数组。
在任何人说之前,不重新抛出异常将是错误的错误处理:这不是真的。错误处理必须符合要求。
在这种情况下,假设程序应该在目录无法读取且不中断的情况下继续运行——最好的例子是遍历目录结构的函数。这里的错误处理只是记录它。当然,这可以做得更好,例如将所有 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);
【讨论】: