首页 新闻 会员 周边

关于Array与数组

1
悬赏园豆:10 [待解决问题]

一个简单的int[] numbers=new int{1,2,3,4};

查看这个numbers对象可以发现它的类型是System.Int32[],而它的基础类型是System.Array。

Array是数组的基类这是众所周知的,但是这个System.Int32[]并没有在任何地方看到有定义,而且Array其实是一个抽象类,他肯定不等价于。我想问是不是当我们调用int[]这种方法的时候,系统会自动创建一个System.Int32[]类型,这个类型继承自System.Array?

林J的主页 林J | 菜鸟二级 | 园豆:202
提问于:2013-10-25 15:38
< >
分享
所有回答(2)
1

那如果是String[]呢?
Array是抽象类,不能直接实例化。从Array.CreateInstance(Type, Length)这个方法来看,可以简单的理解为,Int32[]是Array的泛型实例。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2013-10-25 15:53
那如果是String[]呢?

那就再创建一个String[]类型

泛型是C# 2才引入的概念 数组在C# 1中就有了

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-10-25 15:58

@林J: 肯定不是泛型啦。

支持(0) 反对(0) 飞扬的尘埃 | 园豆:1318 (小虾三级) | 2013-10-25 16:01

@飞扬的尘埃: 看了下Array.CreateInstance(Type, Length)的代码 在最后调用了

// System.Array
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private unsafe static extern Array InternalCreate(void* elementType, int rank, int* pLengths, int* pLowerBounds);

InternalCreate是CLR提供的方法了 在这一步极有可能创建了一个新类型 继承至Array

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-10-25 16:14

@林J: 我肿么感觉,Int32[]这种写法本来就有,而Array只是附加了某些方法啊?

支持(0) 反对(0) 飞扬的尘埃 | 园豆:1318 (小虾三级) | 2013-10-25 17:11

@飞扬的尘埃: 你觉得泛型是如何实现的呢?

在Jit处理泛型的时候,每种List<T>都会生成一段独立的代码,即List<String>和List<Int>是不一样的两段代码,也可以说是不一样的两个类型。放到上面数组层面,就是String[]和Int[]的区别。我就是看了泛型的实现才想到数组可能也是这样来的,那个在定义Int[] numb=new int{1,2,3}时,这里的[]可能只是个关键字一般的存在,在Jit处理的时候,会生成一个System.Int32[]类型。

我也不确定,但是我找不到Int32[]这种类型的代码。而且每当你定义一个新的类型MyClass,你都可以使用MyClass[]这种写法,如果把这里的MyClass[]当成一种类型的话,他是如何产生?

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-10-25 17:23
1
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
    {
       //...      
}

上面是Array的声明  楼主看看吧

Moulton | 园豆:206 (菜鸟二级) | 2013-10-25 15:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册