Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建数组?_C#_Arrays_.net - Fatal编程技术网

C# 如何创建数组?

C# 如何创建数组?,c#,arrays,.net,C#,Arrays,.net,创建数组几乎是编程中最常见和最简单的任务,但在我深入研究C语言之后,我发现它不仅仅是直觉思维。我们都知道要创建阵列,我们可以: int[] myInts = new int[3]; myInts[0] = 1; myInts[1] = 2; myInts[2] = 3; int[] myAnotherInts = new int[] { 1, 2, 3,}; // Array Initialization Syntax 但我们不能这样做: int[] myInts = new int[3]

创建数组几乎是编程中最常见和最简单的任务,但在我深入研究C语言之后,我发现它不仅仅是直觉思维。我们都知道要创建阵列,我们可以:

int[] myInts = new int[3];
myInts[0] = 1;
myInts[1] = 2;
myInts[2] = 3;

int[] myAnotherInts = new int[] { 1, 2, 3,};  // Array Initialization Syntax
但我们不能这样做:

int[] myInts = new int[3](); // why we can't add () in the end?
而我们在收集时使用的是:

List<int> myInts = new List<int>() { 1, 2, 3 };
但是也使用了'new'关键字,这意味着调用了构造函数,这意味着创建了一个实例,不允许创建任何实例是违反抽象类规则的吗

为什么我们最后不能添加

你希望它能做什么?基于C语言的语言渴望简洁;通过介绍您提到的数组初始化语法,您可以看到,c开发团队对提供使代码更紧凑、更简单,同时仍具有可读性的方法很感兴趣。考虑LINQ VS循环,字符串插值,增强“IS”提供实例、速记属性、异步/等待机制、空传播子和?操作人员所有可以避免的速记都是我们过去写得更完整的东西

数组标注语句后面的空括号不会添加任何有用的、可读的、简化的内容,也不会做任何实际的事情,它们只是增加了声明数组时按下的键的数量。然而,在普通构造函数的上下文中,它们确实添加了一些有用的东西——它们告诉编译器和您的同行“我打算调用无参数构造函数”。当创建一个数组(例如从数组派生的int[]时)时,您不会得到这种构造函数的选择,因此为它提供工具是没有意义的。您还需要记住,标注尺寸的数组通常是空的;您可以创建一个包含一百万个字符串的数组,但只调用了一个构造函数;制作数组的那个。。数组插槽为空,等待您说出array[x]=新字符串

如果您的目标是推广这样一个概念,即提供方括号或方括号内的值意味着我们不仅可以声明数组,还可以使用一个新对象初始化数组中的每个元素,该对象的构造函数是用传递的方括号内的参数调用的,那么当然,这是一个选项,您可以向语言团队建议它;我觉得它不会有太大的吸引力,因为一个充满相同对象的数组充其量只是一个很小的用例,可以通过为类创建子类并声明自定义默认值来解决

还使用了“new”关键字,这意味着调用了构造函数,这意味着创建了一个实例,不允许创建任何实例是违反抽象类规则的吗

我想我理解你的意思,但你必须明白数组是所有数组的基类,你不能自己直接初始化它,所以没有违反抽象规则。您创建一个int[],编译器/系统在内部执行必要的洗牌操作,使其从数组派生;通常建议您继续使用提供的语言构造来创建诸如ibt[]之类的东西,这些东西具体地派生自抽象数组。如果调用了一个构造函数,你就看不到它,也没有为它提供参数,所以实际上没有必要要求你写任何东西


需要记住的一件事是,编译器在将您编写的代码编译成IL之前,会对其进行大量重写。上面列出的大多数速记都会被编译器无声地扩展为长文变体,有时相当复杂,因此如果您正在阅读某些内容并认为“这看起来不像C1.0”只需知道,在编译器对其进行预处理时,orbabky看起来更像c的原始最长手形式

Psst:try List myInts=new List{1,2,3};//为什么我们最后不能添加?因为语言语法说你不能。没有比这更好的答案了。所以当你提到从数组派生的int[]时,你能告诉我派生类型int[]的类型吗?我想在VS的Go to definition F12中看到它,看看它是如何从数组基类派生出来的
public abstract class Array : ICloneable, IList, ICollection, IEnumerable...