none
数组问题 RRS feed

  • 问题

  • 还是先来段代码
    static void Main(string[] args)
            {
                int[] a = new int[5];
                Console.WriteLine(a.GetType().FullName);
                Console.WriteLine(a.GetType().BaseType.FullName);
            }
    结果:
    System.Int32[]
    System.Array

    问题:
    System.Int32[]类型是哪里来的?
    Array是个抽象类.
    我觉得是不是在运行时生成了一个System.Int32[]类型,继承于Array类型.

    找了很久找不到特别多的资料,来请教下,呵呵...
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    • 已移动 MagicDreamModerator 2009年9月30日 14:04 发帖人要求 (发件人:一般性问题讨论区)
    2009年9月30日 3:26

答案

  • 数组的内存是连续分配的~如果一个2行5列的二位数组和一个1行10个元素的一维数组的类型和起始地址相同~那这个二维数组的第2行第1个元素的地址和这个一位数组的第6个元素的地址就是一样的了~
    2009年9月30日 16:08
    版主
  • 这个类型一定是存在的啊!你看IL中的声明:
     .locals init ( [0 ] int32 [0...,0...,0...,0...,0...,0...,0...,0...] a )
    CLR在运行程序的时候是可以识别出数组来的(类似int32[]这样的类型声明),并从Array继承,构造一个Int32[]类型
    应该不是预定义的,因为不可能预定义自定义的数组类型,类似于MyClass[]这种!

    另外,IL并没有为多维数组提供指令级的支持,而只对一维0基数组提供了特殊的指令支持,这一点IL代码可以得到验证:
    L_0009: newobj instance void int32 [0...,0...,0...,0...,0...,0...,0...,0...]::.ctor (int32 , int32 ,
    这里使用的是普通的newobj指令,而没有使用newarr指令,从这一点也可以看出,一维0基数组的性能最好的!

    以上是我的个人意见,具体CLR如何处理数组类型,可以参考SSCLI中的代码!

    周雪峰
    2009年10月1日 3:43
    版主
  • 从int[]编译出来的……int的数组……你可以把它考虑为cli.array<T>:System.Array在T=Int32时的一个特化。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月3日 14:25
    版主

全部回复

  • 声明时a就是int[]类型的~全写就是System.Int32[]

    2009年9月30日 5:42
    版主
  • 额..
    可能我没说太清楚...
    我不明白System.Int32[]这个类型是哪里来的.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 6:33
  • int32[] 实际上是一个类,它的基类是Array.实际上,所有的数组类型都是类,而且基类是Array.
    int32[] arr=new int32[10],实际上是创建了int[]这种类型的一个对象,只是微软为了让大家习惯,就使用了类似C++的数组定义方式。
    2009年9月30日 12:26
  •  int[] a = new int[5];
    这里不是声明了一个int[]吗~它就是System.Int32[]~int是System.Int32的别名~
    2009年9月30日 13:03
    版主
  • 抱歉,我帖子发错地方了...能否帮我转到" .NET 开发 论坛 > .NET Framework 一般性问题讨论区"
    谢谢.
    没注意有两个一般性问题讨论区.
    抱歉.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 13:58
  • 3Q for moving.
    抱歉,两个答案都不是我想得到的答案..
    再发段代码
    static void Main(string[] args)
    {
        int[, , , , , , ,] a = new int[6, 6, 6, 6, 6, 6, 6, 6];
        Console.WriteLine(a.GetType().FullName);
        Console.WriteLine(a.GetType().BaseType.FullName);
    }
    运行结果:
    System.Int32[,,,,,,,]
    System.Array

    若如mldark所说,那么这个怎么解释呢?FCL不会一直做到几十亿维的数组吧..
    我觉得可能会是像泛型一样的处理方式?创建临时类型的代码?或者其他...
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 14:09
  • 呵呵...明天是国庆节了....
    大家节日快乐....
    平时都太忙太累,过节的时候都好好休息下吧~
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 14:11
  • 楼主提的这个问题好。
    等待更好的回答。
    做最好的自己
    2009年9月30日 14:22
  • 也祝你节日快乐~~
    int[]是一个一维数组~而int[, , , , , , ,]是一个8维数组~就变成一个8维数组的类型System.Int32[,,,,,,,]了的~但是基类还是Array~
    它也不用在设计时就设计到n维的数据类型呀~n维数组就是一个n*其中一个一维数组长度的一维数组~
    2009年9月30日 14:27
    版主
  • 这个类继承于Array这一点是确定的,我个人认为这个类是运行时由CLR构造的,而不是预定义的!
    IL中内置了用于支持数组的指令了,例如newarr。
    周雪峰
    2009年9月30日 14:34
    版主
  • 也祝你节日快乐~~
    int[]是一个一维数组~而int[, , , , , , ,]是一个8维数组~就变成一个8维数组的类型System.Int32[,,,,,,,]了的~但是基类还是Array~
    它也不用在设计时就设计到n维的数据类型呀~n维数组就是一个n*其中一个一维数组长度的一维数组~

    恩,有点眉目了好像....
    有没有更细节点的资料?
    内部是如何处理的呢?
    我觉得应该有什么规律...
    通项公式类似的东西...
    但是它是什么呢?
    迟迟找不到资料...
    基类这些我们都明白.
    只是如果不创建相应的System.Int32[,,,,,,,, ......]的代码,如何实现呢?
    比如List<int>,会在编译(或者运行时,这个记不清了)时创建临时代码,不同的类型创建不同的代码,相同的类型共用代码(其实这里我也不是很明白,相同的类型指什么?都是引用类型?Or 同样的抽象?)..
    我想,多维数组这里肯定有一个能Handle掉任何维数数组的算法...
    有没有人能来一语道破天机?
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 14:34
  • 3Q for moving.
    抱歉,两个答案都不是我想得到的答案..
    再发段代码
    static void Main(string[] args)
    {
        int[, , , , , , ,] a = new int[6, 6, 6, 6, 6, 6, 6, 6];
        Console.WriteLine(a.GetType().FullName);
        Console.WriteLine(a.GetType().BaseType.FullName);
    }
    运行结果:
    System.Int32[,,,,,,,]
    System.Array

    若如mldark所说,那么这个怎么解释呢?FCL不会一直做到几十亿维的数组吧..
    我觉得可能会是像泛型一样的处理方式?创建临时类型的代码?或者其他...
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    一句两句说不清楚 我介绍一本书 http://www.china-pub.com/195987  NET 探秘:MSIL权威指南 讲解net机制细节
    我准备买的

    2009年9月30日 15:17
  • 额...上次推荐过给我了....
    呵呵...
    早点睡吧...
    等答案~
    《.Net Framework 2.0高级编程》里面对数组有一定的介绍。
    也许我想要的答案只有SSCLI里面才能回答..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 15:23
  • 我觉得数组中的元素在寻址时都是通过第一个元素地址加偏移量来计算地址的~没必要预先就做好几十亿维的数组~是要设计好一个算法把这个偏移量算出来就可以了~不过我没找到相关资料来证实它到底是怎么处理的~

    2009年9月30日 15:48
    版主
  • 是呀...我也是这样觉得的....
    肯定是有什么算法.....
    或者说处理方式,就像内存自动管理那样巧妙....
    但是是什么呢...
    我也找不到资料...
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 15:51
  • 数组的内存是连续分配的~如果一个2行5列的二位数组和一个1行10个元素的一维数组的类型和起始地址相同~那这个二维数组的第2行第1个元素的地址和这个一位数组的第6个元素的地址就是一样的了~
    2009年9月30日 16:08
    版主
  • static void Main(string[] args)
    {
                int[, , , , , , ,] a = new int[6, 6, 6, 6, 6, 6, 6, 6];
                Console.WriteLine(a.GetType().FullName);
                Console.WriteLine(a.GetType().BaseType.FullName);
    }




    .method
    private hidebysig static void Main(string[] args) cil managed { .entrypoint .maxstack 8 .locals init ( [0] int32[0...,0...,0...,0...,0...,0...,0...,0...] a) L_0000: nop L_0001: ldc.i4.6 L_0002: ldc.i4.6 L_0003: ldc.i4.6 L_0004: ldc.i4.6 L_0005: ldc.i4.6 L_0006: ldc.i4.6 L_0007: ldc.i4.6 L_0008: ldc.i4.6 L_0009: newobj instance void int32[0...,0...,0...,0...,0...,0...,0...,0...]::.ctor(int32, int32, int32, int32, int32, int32, int32, int32) L_000e: stloc.0 L_000f: ldloc.0 L_0010: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() L_0015: callvirt instance string [mscorlib]System.Type::get_FullName() L_001a: call void [mscorlib]System.Console::WriteLine(string) L_001f: nop L_0020: ldloc.0 L_0021: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() L_0026: callvirt instance class [mscorlib]System.Type [mscorlib]System.Type::get_BaseType() L_002b: callvirt instance string [mscorlib]System.Type::get_FullName() L_0030: call void [mscorlib]System.Console::WriteLine(string) L_0035: nop L_0036: ret }
    这个就是相对应的代码....
    用的newobj关键字,调用的.ctor构造方法...
    按这样来说的话,还是有一个System.Int32[,,,,, .....]的类,调用构造实例化...
    抓狂了.....
    早睡吧....
    有时间再搞这问题....呵呵......
    也许这个弄明白了就能多学会一种算法或者结构设计之类的思路....
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月30日 16:18
  • 这个类型一定是存在的啊!你看IL中的声明:
     .locals init ( [0 ] int32 [0...,0...,0...,0...,0...,0...,0...,0...] a )
    CLR在运行程序的时候是可以识别出数组来的(类似int32[]这样的类型声明),并从Array继承,构造一个Int32[]类型
    应该不是预定义的,因为不可能预定义自定义的数组类型,类似于MyClass[]这种!

    另外,IL并没有为多维数组提供指令级的支持,而只对一维0基数组提供了特殊的指令支持,这一点IL代码可以得到验证:
    L_0009: newobj instance void int32 [0...,0...,0...,0...,0...,0...,0...,0...]::.ctor (int32 , int32 ,
    这里使用的是普通的newobj指令,而没有使用newarr指令,从这一点也可以看出,一维0基数组的性能最好的!

    以上是我的个人意见,具体CLR如何处理数组类型,可以参考SSCLI中的代码!

    周雪峰
    2009年10月1日 3:43
    版主
  • 没有很满意的答案....
    数组我们每天都在用,用的很熟练,各种不通的数组不同的处理方式也很熟悉...
    但,在CLR内部是如何处理它的呢?内存如何分配的?继承于Array的类是哪里来的?必然不是FCL内置的类型..
    依然没有个确切的答案....
    希望在以后的学习工作中继续发掘....
    如果查到了资料,请继续回复..
    追求技术,追求完美,追求自我能力的极限..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年10月2日 15:57
  • int是System.Int32的别名而已,编译器会把int转换为Int32。

    ECMA-334 C# 语言规范 第18页

    每个内建类型为一个System类型的别名,例如int指System.Int32。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月2日 21:13
    版主
  • I'm not asking what does int is.
    I just want to know where is System.Int32[,,,,, .....] come from..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年10月3日 0:06
  • int是System.Int32的别名而已,编译器会把int转换为Int32

    ECMA-334 C# 语言规范 第18页

    每个内建类型为一个System类型的别名,例如int指System.Int32。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful. 
    Visual C++ MVP



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月3日 1:58
    版主
  • My question is asking a array type, not a simple value type..
    I want to know where's the array type System.Int32[,,,,, ....] come from, not int..
    Everybody knows about the int in C#, Int32 in FCL, int32 in IL.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年10月3日 9:53
  • 编译器会把int转换为Int32,所以int[]编译出来就是Int32[]……

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月3日 12:59
    版主
  • FCL中并没有Int32[]这个类型...
    这个类型是哪里来的?
    我现在正在看Applied Microsoft .NET Framework Programming的第十四章,讲的数组..
    刚刚开始看..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年10月3日 13:01
  • 从int[]编译出来的……int的数组……你可以把它考虑为cli.array<T>:System.Array在T=Int32时的一个特化。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月3日 14:25
    版主
  • 能否提供些这方面的资料?
    书籍,文章之类的....谢谢~
    看来也是属于泛型的范围,运行时临时生成类型代码之类的..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年10月3日 14:33
  • 不是泛型,那是高级语言才有的,底层没这玩意,概念类似而已。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月3日 14:44
    版主