例如,我创建了:
String[] a = new String[5];
我们可以创建上述字符串吗?数组没有大小?
#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
– 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
–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
的调用将调整数组的大小。
评论
stackoverflow.com/questions/151936/…u检查此链接,它可以帮助您清楚地了解数组内容另请参阅all-possible-c-sharp-array-initialization-syntaxes