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

例如,我创建了:

String[] a = new String[5];


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

评论

stackoverflow.com/questions/151936/…u检查此链接,它可以帮助您清楚地了解数组内容

另请参阅all-possible-c-sharp-array-initialization-syntaxes

#1 楼

如果您要使用事先不知道其大小的集合,则有比数组更好的选择。您需要,并且需要返回数组,请在变量上调用List<string>
var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();


评论


@Oded-string [] emptyStringArray =新字符串[0];不会导致一个空数组,对吗?看起来这是一个包含一个元素的数组,其中该元素为null。

– rory.ap
2013年9月27日14:24在

@roryap-否。它导致没有任何元素的string []。如果尝试访问emptyStringArray [0],则将获得IndexOutOfRangeException

–奥德
2013年9月27日14:25



@Oded-谢谢,我是C#的新手。在VB中,提供的索引是上限,而不是元素数。

– rory.ap
2013年9月27日15:47

您认为更好的是:var strings = new string [] {};或var字符串=新字符串[0];顺便说一句:我认为空数组是方法参数的完美有效默认值:public void EditItems(IEnumerable toEdit,IEnumerable toDelete = new long [] {})

– realbart
2014年8月5日在7:58



@ RickO'Shea-C ++不是C#。 Stroustrup知道他的C ++-不确定他知道他的C#和.NET GC。不会和你进行宗教战争。

–奥德
17年2月9日在22:16

#2 楼

试试这个:

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


评论


扩展这个答案,您还可以在不指定大小或类型的情况下使用项目初始化数组,编译器将从初始化程序中推断出:这仍然是一个强类型的字符串数组。

–尼克·范德派尔(Nick VanderPyle)
2012年1月4日14:12



未处理的异常:System.IndexOutOfRangeException:索引在数组边界之外。在ArrayClass.Main(String [] args)。我更改了int []变量= new int [] {}后遇到了这个错误

– yogesh
2012年1月5日在10:25



@yogesh:真奇怪。例如,当编写int []变量= new int [] {}并在诸如foreach(变量中的var){Console.WriteLine(s);}之类的循环中使用它时,代码将编译为:int [] args1 =新的int [0];和foreach(args1中的int num){Console.WriteLine(num);}。因此,使用new int [0]和new int [] {}之间应该没有区别,因为它们都被编译为相同的代码。

–不
2012-12-17 12:15



@GlennGordon绝对可以,但是从C#3.0版开始(这是从2007年开始,在Visual Studio 2008中)。该版本还允许使用带有var的另一种简单格式,尽管仅适用于局部变量(不适用于字段)。但是,在C#2.0(Visual Studio 2005)和更早版本中,您必须使用此答案的语法(或string [] a = new string [0];)。

–杰普·斯蒂格·尼尔森(Jeppe Stig Nielsen)
16-4-18在9:24



#3 楼

在.NET 4.6中,首选方法是使用新方法Array.Empty:使用通用类在.Net中的行为方式,实现是简洁的。

String[] a = Array.Empty<string>();


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

另请参见:


Array.Empty参考源代码
Array.Empty<T>()简介

Marc Gravell-分配,分配,分配-我最喜欢的关于微小隐藏分配的帖子。

评论


@Cole Johnson-感谢您的修改,但我将其回滚了。我故意省略了这些行:我只想引用有趣的实现。代码协定和属性只会妨碍您了解正在发生的事情(当然,到源的链接包含了一切)。我还在注释中添加了换行符,以避免在Stack Overflow上滚动。如果您不介意,我会喜欢这种方式。谢谢!

–科比
16-4-19在5:07



绝对从以下方面改进了可读性:Enumerable.Empty ()。ToArray()

–DanielV
19年1月30日在7:07

即使在大多数情况下绝对首选此方法,也不能回答原始问题。 OP希望创建一个空数组。 Array.Empty ()不创建数组。它返回对预分配数组的引用。

–l33t
19年8月26日在10:57

#4 楼

您可以将其初始化为0,但是当您知道大小为0时,由于无法追加到数组,因此必须重新初始化。

string[] a = new string[0];


评论


这是正确的答案

– Abzarak
19年11月10日在9:16

#5 楼

声明没有大小的数组没有多大意义。数组大小有关。声明特定大小的数组时,请在集合中指定可容纳事物的固定可用插槽数,并相应地分配内存。要向其中添加一些内容,无论如何您都需要重新初始化现有的数组(即使您要调整数组的大小,请参见此线程)。想要初始化一个空数组的罕见情况之一就是将数组作为参数传递。 ,数组不是您的选择,而是类似List<T>或类似的东西。提供两种方式。另一个更简单的选择是: >或其他:

string[] a = { };


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

var a = Enumerable.Empty<string>().ToArray();


评论


除了将数组作为参数传递外,我想不出任何用处。在几种情况下,一种方法接受一个对象数组,而您可能希望传递一个空数组以执行默认操作。我将编辑我的答案。

– nawfal
15年4月29日在9:04

例如,您有一个由多个类实现的接口,这些类返回一个IEnumerable,并且其中一个实现不包含该方法的元素,例如返回一个空数组。

– Ignacio Soler Garcia
15年4月29日在9:33

@IgnacioSolerGarcia在这种情况下,当且仅当它是对性能至关重要的应用程序时,我才会返回一个数组。我会说数组已经过时了,如果可以的话应该避免使用。请参阅利珀特(Lippert)和这位S.O.题

– nawfal
15年4月29日在12:26

请记住,返回的类型是IEnumerable,因此该数组是只读的,并且不打算更改。例如,为什么在这种情况下我会返回一个列表?

– Ignacio Soler Garcia
15年4月29日在12:48

空数组的用例很简单-当您想用对象填充它而又不知道要添加多少个对象时!

–vapcguy
2015年5月8日,3:14

#6 楼

简单而优雅!

string[] array = {}


评论


我会将array更改为a,因为大写时array是一个关键字。将关键字名称用作变量名称是一种错误的做法-即使大小写不同也是如此。基本上与我的答案相同,只不过我那里有String.Empty。

–vapcguy
19年6月13日在13:31

1.数组不是c#关键字。数组是一个类,而不是关键字2。“ a”也是一种不好的做法(甚至比使用关键字更糟糕的一种不好的做法)

–disklosr
19年6月14日14:29



技术性。类,关键字,它定义了对象类型并且仍然很糟糕。您为什么认为a不好?

–vapcguy
19年6月14日在18:17



因为非描述性和一字母变量名称是不好的做法,因为它们没有传达定义它们的背后原因。 “数组”肯定比“ a”更好。更好的名称是“ emptyArray”。

–disklosr
19年6月15日在21:41

#7 楼

string[] a = new string[0];

或简称:

string[] a = { };

现在首选的方式是: br />我写了一个简短的正则表达式,如果要替换零长度分配,可以在Visual Studio中使用,例如var a = Array.Empty<string>();
在启用正则表达式选项的情况下在Visual Studio中使用查找(搜索):与Array.Empty <...>()!

#8 楼

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

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

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


评论


为什么要那样做?在运行时,您通常可以通过变量定义数组大小:int i = 5; string [] a =新的string [i];

–凯文·布洛克(Kevin Brock)
2012年1月4日18:26



好吧,我想使用泛型似乎已经过时了。

– radarbob
13年9月18日在13:59

#9 楼

我尝试过:

string[] sample = new string[0];


或者另一种对我有用的方法:

string[] sample = new string[100];


为列表分配值:

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


#10 楼

据我所知,没有大小就无法制作数组,但是可以使用

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


然后l.ToArray()

#11 楼

结合@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/zh-cn/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标准:2.1预览2.0 1.6 1.5 1.4 1.3

...

HTH

评论


在.NET Core 2中,已经有一个扩展名,arr = Array.Empty ();。

–贾德
19年5月14日在5:58



iirc,在.NetStandart [4.something]中-也有。

– ShloEmi
19年5月14日在8:07



#12 楼

您可以这样做:

评论


这不会创建长度为1的字符串数组吗?

–夏天的埃文斯
2015年5月8日下午4:05

是的,但已清除。 OP要求声明数组而不必声明大小-这很合适。

–vapcguy
2015年5月8日下午4:13

那值得一票,为什么呢? OP意味着不必指定大小,也不必使数组变小。

–vapcguy
2015年5月9日在2:03



@vapcguy我是低俗主义者。我后悔了。我已经编辑了您的答案以取消我的否决票。您的评论使这个问题有些疑问。不知道那是OP的意思。

– nawfal
15年5月12日在11:30

OP要求提供一个空数组。该数组不为空。

–基思
19年5月7日在15:30

#13 楼

这是一个真实的例子。在这种情况下,必须首先将数组foundFiles初始化为零长度。长度1.数组在此行之后的长度为零!)。

如果省略了= string[0]部分,则会出现编译器错误!没有重新抛出。 C#编译器识别代码路径,函数Directory.GetFiles()可以引发异常,以便可以对数组进行初始化。

在任何人说之前,不重新引发异常将是错误的错误处理:真正。错误处理必须符合要求。

在这种情况下,假定程序在无法读取且不中断的目录下应继续执行-最佳示例是遍历函数目录结构。这里的错误处理只是记录它。当然这可以做得更好,例如在列表中收集所有失败的GetFiles(Dir)调用的目录,但这在这里可能会导致太高。零。在catch块中执行此操作就足够了,但这将是不好的样式。

throw的调用将调整数组的大小。