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

是否可以创建一个空数组而不指定大小?

例如,我创建了:

String[] a = new String[5];

我们可以创建上面的字符串数组没有大小?

732479 次浏览

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

string[] a = new string[0];

如果要使用一个事先不知道其大小的集合,有比数组更好的选择。

使用List<string>代替-它将允许您添加任意数量的项,如果您需要返回一个数组,则对变量调用ToArray()

var listOfStrings = new List<string>();


// do stuff...


string[] arrayOfStrings = listOfStrings.ToArray();

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

string[] emptyStringArray = new string[0];

我知道数组不能没有大小,但你可以用

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

然后l.ToArray()

试试这个:

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

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

这将允许您动态地计算数组的大小。但是,一旦定义,大小是不可变的。

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

声明一个没有大小的数组没有多大意义。数组大概是大小。当您声明一个特定大小的数组时,您将指定集合中可用的固定数量的插槽,可以容纳内容,并相应地分配内存。要向它添加内容,无论如何都需要重新初始化现有数组(即使您正在调整数组看这个帖子的大小)。想要初始化空数组的一种罕见情况是将array作为参数传递。

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

也就是说,声明数组而不指定大小的唯一方法是有一个空数组大小为0hemantAlex 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[] a = { String.Empty };

注意:OP意味着不需要指定大小,不需要创建数组体积

在。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];
}

(为了清晰起见,删除了与合同相关的代码)

参见:

结合@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://learn.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 Framework: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6 .NET Framework

.NET标准:2.1预览2.0 1.6 1.5 1.4 1.3

...

HTH

简单优雅!

string[] array = {}

这里有一个真实的例子。在这种情况下,必须首先将数组foundFiles初始化为0 length。

(正如在其他回答中强调的那样:这不会初始化一个元素,尤其是索引为0的元素,因为这意味着数组的长度为1。数组在这行之后的长度为零!)

如果省略了= string[0]部分,则存在编译器错误!

这是因为没有重新抛出的捕捉块。c#编译器识别代码路径,函数Directory.GetFiles()可以抛出异常,因此数组可以未初始化。

在有人说,不重新抛出异常将是糟糕的错误处理之前:这不是真的。错误处理必须符合要求。

在这种情况下,假定在无法读取目录的情况下,程序应该继续,而不是中断——最好的例子是一个遍历目录结构的函数。这里的错误处理只是记录它。当然,这可以做得更好,例如收集所有GetFiles(Dir)调用失败的目录在一个列表中,但这将在这里走得太远。

只要声明避免throw是一个有效的场景就足够了,因此数组必须初始化为长度为0。在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];

但我只能插入一个字符串,然后我得到一个exceptionOutOfBound错误,所以我只是简单地为它输入一个大小,比如

string[] sample = new string[100];

或者另一种适合我的方法:

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

为列表赋值:

sample.Add(your input);

string[] a = new string[0];

或简称:

string[] a = { };

现在的首选方式是:

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

我已经写了一个简短的正则表达式,如果你想替换零长度分配,你可以在Visual Studio中使用,例如new string[0]。 在Visual Studio中使用查找(搜索),并打开正则表达式选项:

new[ ][a-zA-Z0-9]+\[0\]

现在查找全部或F3(查找下一个),并替换所有数组. 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;
}

性能规则CA1825:避免分配零长度的数组。

< p >规则解释: 初始化零长度数组会导致不必要的内存分配。相反,通过调用array来使用静态分配的空数组实例。空方法。< / p >

在你的情况下:

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