日期:2014-05-17  浏览次数:21129 次

C#的数组一定是声明在堆上面吗? 哪怕用初始化列表构造的也是?
int ai[]=new int{1,2,3}这个ai是在堆上面存在的,是吧。

然后如果是不用new直接int bi[]={1,2,3}也能编译运行。请问这个bi是存在于当前的调用栈上面(值类型)还是仍然被编译成了new的形式存在于堆上,是一个有引用计数的对象?

------解决方案--------------------
.net 的数组其实是Aarry的子类
------解决方案--------------------
查msdn 关于 Array
用reflect
一下子就清楚了
------解决方案--------------------

            int[] bi ={1,2,3};
            if (bi is Array)
            {
                string typename = bi.ToString();
            }

------解决方案--------------------
两种 形式本质是一样的.
都在堆上.
------解决方案--------------------
不一定是在堆上,只能说是默认在堆上,你可以指定stackalloc使之存放于栈上
至于你的例子,后面一个就是前面一个的语法糖而已
------解决方案--------------------
引用:
不一定是在堆上,只能说是默认在堆上,你可以指定stackalloc使之存放于栈上
至于你的例子,后面一个就是前面一个的语法糖而已

stackalloc出来的不是.net的数组,它类似于c中一段内存