C#可以使用哪些数组初始化语法?
当前回答
C#中的数组创建语法是表达式:
new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }
在第一个例子中,大小可以是任何非负整数,并且数组元素被初始化为默认值。
在第二个例子中,大小必须是常量,并且给定的元素数量必须匹配。必须存在从给定元素到给定数组元素类型的隐式转换。
在第三种情况下,元素必须隐式转换为元素类型,大小由给定的元素数量决定。
在第四种方法中,通过计算所有具有类型的给定元素中的最佳类型(如果有)来推断数组元素的类型。所有元素都必须隐式转换为该类型。大小根据给定的元素数量确定。此语法是在C#3.0中引入的。
还有一种语法只能在声明中使用:
int[] x = { 10, 20, 30 };
元素必须隐式转换为元素类型。大小根据给定的元素数量确定。
没有一个综合指南
请参考C#4.0规范第7.6.10.4节“数组创建表达式”。
其他回答
hi只是为了添加另一种方式:从此页面:https://learn.microsoft.com/it-it/dotnet/api/system.linq.enumerable.range?view=netcore-3.1
如果您想生成0到9的指定范围内的整数序列,可以使用此表单:
using System.Linq
.....
public int[] arrayName = Enumerable.Range(0, 9).ToArray();
这些是简单数组的当前声明和初始化方法。
string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2
注意,还有其他获取数组的技术,例如IEnumerable<T>上的Linq ToArray()扩展。
还要注意,在上面的声明中,前两个可以用var(C#3+)替换左边的字符串[],因为右边的信息足以推断正确的类型。第三行必须按照显示的方式编写,因为仅使用数组初始化语法不足以满足编译器的要求。第四个也可以使用推理。因此,如果你关注整个简短的事情,上面的内容可以写成
var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2
另一种方法是调用静态函数(用于静态对象)或实例对象的任何函数。这可用于成员初始化。
现在我还没有测试所有这些,所以我将把我测试过的(静态成员和静态函数)
Class x {
private static Option[] options = GetOptionList();
private static Option[] GetOptionList() {
return (someSourceOfData).Select(dataitem => new Option()
{field=dataitem.value,field2=dataitem.othervalue});
}
}
我想知道的是,是否有绕过函数声明的方法。我知道在这个例子中,它可以直接使用,但假设函数稍微复杂一些,不能简化为一个表达式。
我想象如下(但不起作用)
Class x {
private static Option[] options = () => {
Lots of prep stuff here that means we can not just use the next line
return (someSourceOfData).Select(dataitem => new Option()
{field=dataitem.value,field2=dataitem.othervalue});
}
}
基本上是为填充变量的范围声明函数的一种方式。如果有人能教我怎么做,我会很高兴的。
带有表达式的平凡解决方案。注意,使用NewArrayInit,您可以只创建一维数组。
NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) });
int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback
要初始化空数组,在dotnet 5.0中应该是array.empty<T>()
对于字符串
var items = Array.Empty<string>();
对于编号
var items = Array.Empty<int>();