C#可能使用的所有数组初始化语法是什么?
C#可能使用的所有数组初始化语法是什么?
Answers:
这些是简单数组的当前声明和初始化方法。
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
请注意,还存在其他获取数组的技术,例如上的Linq ToArray()
扩展IEnumerable<T>
。
还要注意,在上面的声明中,前两个可以string[]
用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
var x = {}
如果数组初始值设定项可以产生除数组以外的任何内容,那是不可行的,但我不知道那是什么。所以我猜想数组初始化器是一种语言功能。如果与它一起使用new List<string> {"A", "B"}
,也会产生不同的结果。
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节“数组创建表达式”。
Array.CreateInstance(typeof(int), 3)
!
"1,2,3,4".split(',')
。
new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
,等为int[,,]
,int[,,,]
,...
var data0 = new int[3]
var data1 = new int[3] { 1, 2, 3 }
var data2 = new int[] { 1, 2, 3 }
var data3 = new[] { 1, 2, 3 }
var data4 = { 1, 2, 3 }
是不可编译的。使用int[] data5 = { 1, 2, 3 }
代替。
var data6 = new int[0]
var data7 = new int[] { }
var data8 = new [] { }
并且int[] data9 = new [] { }
不可编译。
var data10 = { }
是不可编译的。使用int[] data11 = { }
代替。
只有可以用var
关键字分配的表达式才能作为参数传递。
Foo(new int[2])
Foo(new int[2] { 1, 2 })
Foo(new int[] { 1, 2 })
Foo(new[] { 1, 2 })
Foo({ 1, 2 })
是不可编译的 Foo(new int[0])
Foo(new int[] { })
Foo({})
是不可编译的Enumerable.Repeat(String.Empty, count).ToArray()
将创建重复“计数”次的空字符串数组。如果要使用相同但特殊的默认元素值初始化数组。小心引用类型,所有元素都将引用同一对象。
var arr1 = Enumerable.Repeat(new object(), 10).ToArray();
您将获得10个对同一对象的引用。要创建10个不同的对象,可以使用var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();
或类似的对象。
var contacts = new[]
{
new
{
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new
{
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
下面是类的定义。
public class DummyUser
{
public string email { get; set; }
public string language { get; set; }
}
这是初始化数组的方法:
private DummyUser[] arrDummyUser = new DummyUser[]
{
new DummyUser{
email = "abc.xyz@email.com",
language = "English"
},
new DummyUser{
email = "def@email.com",
language = "Spanish"
}
};
int[] array = new int[4];
array[0] = 10;
array[1] = 20;
array[2] = 30;
要么
string[] week = new string[] {"Sunday","Monday","Tuesday"};
要么
string[] array = { "Sunday" , "Monday" };
并在多维数组中
Dim i, j As Integer
Dim strArr(1, 2) As String
strArr(0, 0) = "First (0,0)"
strArr(0, 1) = "Second (0,1)"
strArr(1, 0) = "Third (1,0)"
strArr(1, 1) = "Fourth (1,1)"
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
创建和初始化对象数组的另一种方法。这类似于@Amol上面发布的示例,除了此示例使用构造函数。一点点的多态性涌入,我无法抗拒。
IUser[] userArray = new IUser[]
{
new DummyUser("abc@cde.edu", "Gibberish"),
new SmartyUser("pga@lna.it", "Italian", "Engineer")
};
上下文类:
interface IUser
{
string EMail { get; } // immutable, so get only an no set
string Language { get; }
}
public class DummyUser : IUser
{
public DummyUser(string email, string language)
{
m_email = email;
m_language = language;
}
private string m_email;
public string EMail
{
get { return m_email; }
}
private string m_language;
public string Language
{
get { return m_language; }
}
}
public class SmartyUser : IUser
{
public SmartyUser(string email, string language, string occupation)
{
m_email = email;
m_language = language;
m_occupation = occupation;
}
private string m_email;
public string EMail
{
get { return m_email; }
}
private string m_language;
public string Language
{
get { return m_language; }
}
private string m_occupation;
}
您也可以创建动态数组,即您可以在创建数组之前先向用户询问数组的大小。
Console.Write("Enter size of array");
int n = Convert.ToInt16(Console.ReadLine());
int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n
Console.WriteLine("Input Elements");
for(int i=0;i<n;i++)
{
dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("Elements of array are :");
foreach (int i in dynamicSizedArray)
{
Console.WriteLine(i);
}
Console.ReadKey();
只是一个笔记
以下数组:
string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };
将被编译为:
string[] array = new string[2];
string[] array2 = new string[]
{
"A",
"B"
};
string[] array3 = new string[]
{
"A",
"B"
};
string[] array4 = new string[]
{
"A",
"B"
};
var
变量吗?