T [,]和T [*,*]之间有什么区别?

时间:2012-02-20 05:17:38

标签: c# arrays c#-4.0 multidimensional-array

我的Google-Jitsu让我失望了。问题在标题中...... T[,]T[*,*]之间有什么区别? 我正在寻找一个2,2 / 2部分答案:

  1. Layman(或超级建筑师)用示例代码进行简单的英语解释。

  2. 链接到这种区别的正式文件。

    奖励:指向定义此内容的C#4规范中的子部分和页码。 (它不在第12节“阵列”)

  3. 我得到了这个概念here

2 个答案:

答案 0 :(得分:15)

T[]表示从零开始的T 数组(array [0]是它的第一个元素)

T[*]表示基于非零的T 数组(array [0]不是它的第一个元素,甚至可以超出范围)

link from your question解释说没有T[*,*]类型的数组,因为T[,]的所有多维数组都被视为具有未知下限的数组。

下面的代码段显示了如何创建T[*]的实例。请注意,您无法将其强制转换为T[],因为它们是不同的类型。 a[0]这里会抛出一个OutOfRangeException,这个数组中第一个元素的索引是1 (啊,旧的Pascal天......)

Array a = Array.CreateInstance(typeof(String), new Int32[] { 1 }, new Int32[] { 1 });
Console.WriteLine(a.GetType());    // System.String[*]  

More example code

Bonus。 C#语言规范说,“数组元素的索引范围从0到长度 - 1”。显然,该语言不提供对非零数组的内置支持,它只是一个可以创建的自定义数据结构;虽然具体在某种意义上说编译器恰好有一个特殊的符号用于它的类型,VS在你调试时会使用标准的数组可视化器。

另见:

How to create a 1-Dimensional Array in C# with index starting at 1

C#: Nonzero-based arrays are not CLS-compliant

答案 1 :(得分:3)

实际上 ...

C# 支持1维数组......排序。

嗯,确实如果你使用var

首先,你需要使用ILAsm.exe将它编译成一个程序集(我知道,这不是C#......):

.assembly extern mscorlib
{
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
    .ver 2:0:0:0
}
.assembly ArrayHelper { }
.module ArrayHelper.dll
.subsystem 0x0003
.class public ArrayHelper   
{
    .method public hidebysig static !!T[...]
        CastTo1D<T>(class [mscorlib]System.Array 'array') cil managed
    {
        ldarg.0
        castclass  !!T[...]
        ret
    }
    .method public hidebysig static !!T[...] Create1D<T>(int32 len) cil managed
    {
        ldarg.0
        newobj     instance void !!T[...]::.ctor(int32)
        ret
    }
    .method public hidebysig static !!T[...]
        Create1D<T>(int32 lowerBound, int32 length) cil managed
    {
        ldarg.0
        ldarg.1
        newobj     instance void !!T[...]::.ctor(int32, int32)
        ret
    }
}

然后你可以做类似的事情:

var my1DArray = ArrayHelper.Create<int>(1, 5);

创建长度为5且下限为1的1-D数组。

哎呀,即使Visual Studio支持这个!

Visual Studio Screenshot

希望你玩得开心。