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

时间:2012-01-04 12:49:04

标签: c# arrays initialization

是否可以在不指定大小的情况下创建空数组?

例如,我创建了:

String[] a = new String[5];

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

14 个答案:

答案 0 :(得分:368)

如果你打算使用一个你不知道大小的集合,那么有比阵列更好的选择。

使用List<string>代替 - 它可以让您根据需要添加任意数量的项目,如果需要返回数组,请在变量上调用ToArray()

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

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

string[] emptyStringArray = new string[0]; 

答案 1 :(得分:156)

试试这个:

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

答案 2 :(得分:81)

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

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

另见:

答案 3 :(得分:29)

您可以使用0的大小初始化它,但是当您知道大小时,您将不得不重新初始化它,因为您无法附加到数组。

string[] a = new string[0];

答案 4 :(得分:6)

声明没有大小的数组没什么意义。数组大小。声明特定大小的数组时,可以指定可以容纳内容的集合中可用的固定插槽数,并相应地分配内存。要向其中添加内容,您无论如何都需要重新初始化现有数组(即使您正在调整数组大小,see this thread)。您想要初始化空数组的极少数情况之一是将数组作为参数传递。

如果你想知道一个集合,当你不知道它可能的大小时,数组不是你的选择,而是像List<T>或类似的那样。

也就是说,在没有指定大小的情况下声明数组的唯一方法是使用 size 0 的空数组。 hemantAlex 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);

答案 5 :(得分:3)

你可以这样做:

string[] a = { String.Empty };

注意:OP意味着不必指定大小,不能创建数组无大小

答案 6 :(得分:2)

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

这将允许您做任何动态计算数组大小的操作。但是,一旦定义,大小就是不可变的。

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

答案 7 :(得分:2)

简单而优雅!

string[] array = {}

答案 8 :(得分:2)

我曾尝试过:

string[] sample = new string[0];

但是我只能在其中插入一个字符串,然后我得到了一个exceptionOutOfBound错误,所以我只是为它设置一个大小,比如

string[] sample = new string[100];

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

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

为列表分配值:

sample.Add(your input);

答案 9 :(得分:1)

据我所知,你不能制作没有大小的数组,但你可以使用

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

然后l.ToArray()

答案 10 :(得分:0)

结合@nawfal&amp; @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 Preview 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

...

HTH

答案 11 :(得分:0)

这是一个真实世界的例子。在此,有必要首先将数组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);

答案 12 :(得分:0)

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(查找下一个),并将其全部替换为Array.Empty <…>()!

答案 13 :(得分:0)

您可以使用 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;
}