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

yog*_*esh 299 c# arrays initialization

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

例如,我创建了:

String[] a = new String[5];
Run Code Online (Sandbox Code Playgroud)

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

Ode*_*ded 403

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

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

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();
Run Code Online (Sandbox Code Playgroud)

如果必须创建一个空数组,则可以执行以下操作:

string[] emptyStringArray = new string[0]; 
Run Code Online (Sandbox Code Playgroud)

  • @roryap - 不会导致`string []`没有元素.如果您尝试访问`emptyStringArray [0]`,您将得到`IndexOutOfRangeException` (11认同)
  • @ RickO'Shea - C++不是C#.Stroustrup知道他的C++ - 不确定他是否知道他的C#和.NET GC.不会和你发生宗教战争. (4认同)
  • @Oded -- string[] emptyStringArray = new string[0]; 不会导致空数组,是吗?看起来它是一个包含一个元素的数组,该元素为空。 (3认同)

小智 172

试试这个:

string[] a= new string[] { };
Run Code Online (Sandbox Code Playgroud)

  • 扩展这个答案,您也可以使用项目初始化数组而不指定大小OR类型,编译器将从初始化程序推断:var a = new [] {"a","b","c"}; 这仍然是一个强类型字符串数组. (7认同)
  • @yogesh:这很奇怪.例如,当编写`int [] variable = new int [] {}`并在例如`foreach(var s in variable){Console.WriteLine(s);}中的循环中使用它时,代码被编译为:`int [] args1 = new int [0];`和`foreach(args1中的int num){Console.WriteLine(num);}`.因此,使用`new int [0]`和`new int [] {}`之间应该没有区别,因为两者都被编译为相同的代码. (5认同)
  • @NickVanderPyle是的,但对于一个空数组,它不会工作. (3认同)

Kob*_*obi 91

在.Net 4.6中,首选方法是使用新方法Array.Empty:

String[] a = Array.Empty<string>();
Run Code Online (Sandbox Code Playgroud)

实现简洁,使用泛型类的静态成员如何在.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];
}
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

  • 绝对是可读性的改进:`Enumerable.Empty&lt;T&gt;().ToArray()` (2认同)

Mat*_*asG 33

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

string[] a = new string[0];
Run Code Online (Sandbox Code Playgroud)


小智 10

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

规则说明:初始化零长度数组会导致不必要的内存分配。相反,通过调用 Array.Empty 方法来使用静态分配的空数组实例。

在你的情况下:

var a = Array.Empty<string>(); 
Run Code Online (Sandbox Code Playgroud)


naw*_*fal 7

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

如果你想在不知道它可能的大小时定义一个集合,那么数组不是你的选择,而是类似的东西List<T>.

也就是说,声明数组而不指定大小的唯一方法是使用大小为0的空数组.hemantAlex Dn提供两种方式.另一个更简单的选择是:

string[] a = { };
Run Code Online (Sandbox Code Playgroud)

[ 括号内的元素应该可以隐式转换为定义的类型,例如string[] a = { "a", "b" }; ]

还是另一个:

var a = Enumerable.Empty<string>().ToArray();
Run Code Online (Sandbox Code Playgroud)

这是一种更具声明性的方式:

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话:

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

//or

var a = Array<string>.Empty(5);
Run Code Online (Sandbox Code Playgroud)

  • 有很多用例,返回一个空数组是有道理的...... (10认同)

dis*_*osr 7

简单而优雅!

string[] array = {}
Run Code Online (Sandbox Code Playgroud)

  • 1. array 不是 ac# 关键字。Array 是一个类而不是关键字 2. "a" 也是不好的做法(可能比使用关键字更糟糕的坏做法) (2认同)

juF*_*uFo 6

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\]

现在 Find All 或 F3 (Find Next) 并用 Array.Empty<…>() 替换 all !


归档时间:

查看次数:

487396 次

最近记录:

6 年,3 月 前