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

例如,我创建了:

String[] a = new String[5];

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


当前回答

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

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

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

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

string[] emptyStringArray = new string[0]; 

其他回答

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

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

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

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

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

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

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

string[] emptyStringArray = new string[0]; 

你可以使用数组。空方法(至少在。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;
}

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

如果你想定义一个集合,但你不知道它可能有多大,数组不是你的选择,而是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);

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

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

如果省略了part = 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);