为什么在c#中int[] i = new int[2];i={1,2};是错误的。
答案:4 悬赏:60 手机版
解决时间 2021-04-27 16:31
- 提问者网友:焚苦与心
- 2021-04-26 17:37
为什么在c#中int[] i = new int[2];i={1,2};是错误的。
最佳答案
- 五星知识达人网友:慢性怪人
- 2021-04-26 18:20
你的问题是为什么是错误的,楼上几位都给出了怎么做是正确的,但没说什么错误。
先来说一下为什么错误。
int[] i = new int[2]; //正确,声明了一个长度为2的一维数组,并且每个值都有初始值0
i={1,2}; //语法错误 {1,2}这个不符合C#语法,是不会编译通过。(主要是C#语法没提供这个方便性,如果自己写个编译器支持这个语法就可以编译通过了,呵呵。
int[] i = { 1, 2 }; //{1,2}只有在赋值语句右侧才符合C#语法,但也只是C#语法的简便写法
int[] i=new int[2]{1,2}; //这个是标准写法,在初始化时进行赋值
还有一种分开的写法
int[] i = new int[2]; i[0]=1;i[1]=2; //这个更灵活。追问我是这样想的:int[] i;是定义一个数组类型的i,也就是说i的类型是int[].如果按照同是引用类型的的string的语法:定义一个字符串 string s; 就可用s=“hello word”初始化。所以我就觉得数组类型应该也是可以的啊。当然结果是不可以。我在想这两种引用类型到底有什么区别?追答string类型确实是引用类型,但它是一比较特殊的引用类型,C#有一些特殊的语法对它进行支持。
例如s=“hello word”就可以初始化,但这行代码里面实际上是创建了两个字符串实例。"hello word"是一个,之后给s赋值后又有一个。因为string是值不可改的引用类型。并且支持"hello word"这样的初始化语法。
而数组是真正的引用类型,当使用i={1,2};时,{1,2}在非实例化对象时,是不会被编译器编译的,也就是说除了在实例化对象时,编译器知道{1,2}代表什么意义外,其他情况编译器是不知道这个语法的。更别说使用{1,2}创建一个数组,再给其他对象赋值了。追问string s;不是表示在栈中生成一个string类型的变量s,而“hello world”表示在堆中生成一个string类型的对象,s="hello world"表示变量s指向"hello world"这个对象?怎么会生成两个呢。当然string是不可变的(好像引用类型都不可变吧,只是指向了另一个对象了)。还有{1,2}这个不是表示堆中的一个数组对象么追答string s;是在栈中创建一个指定空引用的占位符。
“hello world”表示在堆中生成一个string类型的对象,但将"hello world"赋值给s后,不是将'hello world"的引用赋值给s,而是创建了一个新的"hello world"给s。【可以和值类型一样理解】
不可改的引用类型指的是当他给另一个对象赋值后,是使用新的对象对它进行赋值,而不是原来的对象。
{1,2}这个不是表示堆中的一个数组对象么?
这个在赋值时,是不会自动在内存堆中创建对象的,因为编译器不认。追问“hello world”表示在堆中生成一个string类型的对象,但将"hello world"赋值给s后,不是将'hello world"的引用赋值给s,而是创建了一个新的"hello world"给s。【可以和值类型一样理解】 {1,2}这个不是表示堆中的一个数组对象么?
这个在赋值时,是不会自动在内存堆中创建对象的,因为编译器不认。
这些是在哪本书上看到的?我用ildasm查看中间代码,真的是只有一个string 对象,没看到另一个追答兄弟我承认创建两个对象是不对的。刚才也看了一下IL代码。
IL_0000: nop
IL_0001: ldstr "hello word"
IL_0006: stloc.0
IL_0007: ret
刚才又看了一下CLR via C#(第3版),第14章 字符、字符串和文本处理,发现自己理解的还不是很正确,这次又加深了一次印象。追问呵呵,互相学习嘛。不过说句实在话我的疑惑还是未解啊,不明白。你那个对于数组的理解是在哪看到的?数组的中间代码我就看不出什么名堂。先给你个最佳吧,兄弟。继续讨论?追答数组的理解,是由自身的理解是在看Programming C#中文版(第4版)里面有介绍数组赋值时,有两种语句一种长语法,一种短语法,但只有创建时赋值才可用,其他情况是不可用的。
先讨论到这里吧,一会要下班了。
int[] myIntArray = new int[5] {1,2,}; //长语法
int[] myIntArray = {1,2}; //短语法
下面有个提示:之所以存在两种语法,是因为在一些比较罕见的情况下,必须使用长语法。比如,c#编译器无法推断数组的正确类型。
先来说一下为什么错误。
int[] i = new int[2]; //正确,声明了一个长度为2的一维数组,并且每个值都有初始值0
i={1,2}; //语法错误 {1,2}这个不符合C#语法,是不会编译通过。(主要是C#语法没提供这个方便性,如果自己写个编译器支持这个语法就可以编译通过了,呵呵。
int[] i = { 1, 2 }; //{1,2}只有在赋值语句右侧才符合C#语法,但也只是C#语法的简便写法
int[] i=new int[2]{1,2}; //这个是标准写法,在初始化时进行赋值
还有一种分开的写法
int[] i = new int[2]; i[0]=1;i[1]=2; //这个更灵活。追问我是这样想的:int[] i;是定义一个数组类型的i,也就是说i的类型是int[].如果按照同是引用类型的的string的语法:定义一个字符串 string s; 就可用s=“hello word”初始化。所以我就觉得数组类型应该也是可以的啊。当然结果是不可以。我在想这两种引用类型到底有什么区别?追答string类型确实是引用类型,但它是一比较特殊的引用类型,C#有一些特殊的语法对它进行支持。
例如s=“hello word”就可以初始化,但这行代码里面实际上是创建了两个字符串实例。"hello word"是一个,之后给s赋值后又有一个。因为string是值不可改的引用类型。并且支持"hello word"这样的初始化语法。
而数组是真正的引用类型,当使用i={1,2};时,{1,2}在非实例化对象时,是不会被编译器编译的,也就是说除了在实例化对象时,编译器知道{1,2}代表什么意义外,其他情况编译器是不知道这个语法的。更别说使用{1,2}创建一个数组,再给其他对象赋值了。追问string s;不是表示在栈中生成一个string类型的变量s,而“hello world”表示在堆中生成一个string类型的对象,s="hello world"表示变量s指向"hello world"这个对象?怎么会生成两个呢。当然string是不可变的(好像引用类型都不可变吧,只是指向了另一个对象了)。还有{1,2}这个不是表示堆中的一个数组对象么追答string s;是在栈中创建一个指定空引用的占位符。
“hello world”表示在堆中生成一个string类型的对象,但将"hello world"赋值给s后,不是将'hello world"的引用赋值给s,而是创建了一个新的"hello world"给s。【可以和值类型一样理解】
不可改的引用类型指的是当他给另一个对象赋值后,是使用新的对象对它进行赋值,而不是原来的对象。
{1,2}这个不是表示堆中的一个数组对象么?
这个在赋值时,是不会自动在内存堆中创建对象的,因为编译器不认。追问“hello world”表示在堆中生成一个string类型的对象,但将"hello world"赋值给s后,不是将'hello world"的引用赋值给s,而是创建了一个新的"hello world"给s。【可以和值类型一样理解】 {1,2}这个不是表示堆中的一个数组对象么?
这个在赋值时,是不会自动在内存堆中创建对象的,因为编译器不认。
这些是在哪本书上看到的?我用ildasm查看中间代码,真的是只有一个string 对象,没看到另一个追答兄弟我承认创建两个对象是不对的。刚才也看了一下IL代码。
IL_0000: nop
IL_0001: ldstr "hello word"
IL_0006: stloc.0
IL_0007: ret
刚才又看了一下CLR via C#(第3版),第14章 字符、字符串和文本处理,发现自己理解的还不是很正确,这次又加深了一次印象。追问呵呵,互相学习嘛。不过说句实在话我的疑惑还是未解啊,不明白。你那个对于数组的理解是在哪看到的?数组的中间代码我就看不出什么名堂。先给你个最佳吧,兄弟。继续讨论?追答数组的理解,是由自身的理解是在看Programming C#中文版(第4版)里面有介绍数组赋值时,有两种语句一种长语法,一种短语法,但只有创建时赋值才可用,其他情况是不可用的。
先讨论到这里吧,一会要下班了。
int[] myIntArray = new int[5] {1,2,}; //长语法
int[] myIntArray = {1,2}; //短语法
下面有个提示:之所以存在两种语法,是因为在一些比较罕见的情况下,必须使用长语法。比如,c#编译器无法推断数组的正确类型。
全部回答
- 1楼网友:逃夭
- 2021-04-26 20:30
赋值要i[1]=1;i[2]=2;
或者int[] i=new int[2]{1,2};
或者int[] i=new int[2]{1,2};
- 2楼网友:神的生死簿
- 2021-04-26 19:27
int[] i = { 1, 2 };你直接这么写就行了
- 3楼网友:我住北渡口
- 2021-04-26 19:07
语法错误 例子:桌子分为左右两块 ,给桌子上两块分别放一个东西顺序是?你会给左边先放一个再给右边放一个,或者从右开发放。 怎么也不可能两个同时放。一个道理,定义了一个2个长度的数组,你要放连个值,也是有顺序的放才行。i[0]=1;i[1]=2;这样就不会错。
满意回答 请采纳 评分 谢谢追问那为什么这样 int[] i = {1,2} 就可以呢?追答int[] i = {1,2}这个意思就是 例如: 你放了多少东西 这个桌子就是多大的。追问我的意思是数组也是引用类型。为什么string可以string s;s ="hello world"。而数组就不可以呢。
而数组可以先这样 int[] i = {1,2,3}实例化(数组变量i指向{1,2,3}这个数组对象);然后重新这样i=new int[5]实例化(数组变量i指向另外一个数组对象new int[5]),但是不可以反过来先int[] i = new int[5],然后再这样i={1,2,3} 。按说应该是一样的啊。追答string好比一个空的教室,可以直接给里面放东西
int[] i好比一个放有桌子的教室,要对号入座
你说的引用类型和这个没有关系吧。你没有理解这两种类型的意思。
如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。
“引用类型”包含指向存储数据的其他内存位置的指针。
满意回答 请采纳 评分 谢谢追问那为什么这样 int[] i = {1,2} 就可以呢?追答int[] i = {1,2}这个意思就是 例如: 你放了多少东西 这个桌子就是多大的。追问我的意思是数组也是引用类型。为什么string可以string s;s ="hello world"。而数组就不可以呢。
而数组可以先这样 int[] i = {1,2,3}实例化(数组变量i指向{1,2,3}这个数组对象);然后重新这样i=new int[5]实例化(数组变量i指向另外一个数组对象new int[5]),但是不可以反过来先int[] i = new int[5],然后再这样i={1,2,3} 。按说应该是一样的啊。追答string好比一个空的教室,可以直接给里面放东西
int[] i好比一个放有桌子的教室,要对号入座
你说的引用类型和这个没有关系吧。你没有理解这两种类型的意思。
如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。
“引用类型”包含指向存储数据的其他内存位置的指针。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯