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变量吗?