Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# T[,]和T[*,*]之间的区别是什么?_C#_Arrays_C# 4.0_Multidimensional Array - Fatal编程技术网

C# T[,]和T[*,*]之间的区别是什么?

C# T[,]和T[*,*]之间的区别是什么?,c#,arrays,c#-4.0,multidimensional-array,C#,Arrays,C# 4.0,Multidimensional Array,我的谷歌柔术让我失望。问题在标题中。。。T[,]和T[*,*]之间有什么区别? 我正在寻找一个2,2-1/2部分的答案: 外行的(或超级架构师的)简单的英语解释和示例代码 链接到该区别的正式文档 额外好处:指向C#4规范中定义这一点的小节和页码。(不在第12节“阵列”中) 我得到了这个概念。T[]意味着T的零基数组(数组[0]是它的第一个元素) T[*]表示T的非零基数组(数组[0]不是它的第一个元素,甚至可能超出范围) 说明不存在T[*,*]类型的数组,因为T[,]的所有多维数组都被视为具

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

  • 外行的(或超级架构师的)简单的英语解释和示例代码

  • 链接到该区别的正式文档

    额外好处:指向C#4规范中定义这一点的小节和页码。(不在第12节“阵列”中)


  • 我得到了这个概念。

    T[]
    意味着T的零基数组(数组[0]是它的第一个元素)

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

    说明不存在
    T[*,*]
    类型的数组,因为
    T[,]
    的所有多维数组都被视为具有未知下限的数组

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

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

    另见:

    实际上。。。 C#支持一维数组。。。某种程度上。 嗯,是的。。。如果使用
    var

    首先,您需要使用
    ILAsm.exe
    将其编译成程序集(我知道,这还不是C#…呢):

    .assembly extern mscorlib
    {
    .publickeytoken=(B7 7A 5C 56 19 34 E0 89)
    .版本2:0:0:0
    }
    .assembly ArrayHelper{}
    .module ArrayHelper.dll
    .子系统0x0003
    .class公共阵列帮助器
    {
    .method公共隐藏静态!!T[…]
    CASTTOAD(类[mscorlib]System.Array“Array”)cil管理
    {
    ldarg.0
    castclass!!T[…]
    ret
    }
    .method public hidebysing static!!T[…]创建1D(int32 len)cil托管
    {
    ldarg.0
    newobj实例无效!!T[…]:.ctor(int32)
    ret
    }
    .method公共隐藏静态!!T[…]
    Create1D(int32 lowerBound,int32长度)cil管理
    {
    ldarg.0
    ldarg.1
    newobj实例无效!!T[…]:.ctor(int32,int32)
    ret
    }
    }
    
    然后,您可以执行以下操作:

    var my1DArray = ArrayHelper.Create<int>(1, 5);
    
    var my1DArray=ArrayHelper.Create(1,5);
    
    创建长度为5且下限为1的一维数组

    见鬼,甚至VisualStudio都支持这一点


    希望您玩得开心。

    基于零的数组是否表示下限=0?“非零基数组”表示下界=0?@dFlat:是的,这正是它的意思。谢谢你的详细回答。图片没有为我加载。。。你能修好吗?@Yacoder:真奇怪。。。对我来说没问题。试着点击一下?我明白了,现在可以了。是的,IDE和编译器似乎知道这种情况,尽管C#规范只考虑基于零的数组类型。没有语法可以在C#中编写类似于smth的字符串[*]。您通常从COM互操作中获取此类对象。具有非零下限的安全数组,通常为1。使用Array.GetValue()和GetLower/UpperBound()进行转换。@Hans,是的,他们是从Excel PIA获得的,并解决了这个越界问题。请看这里:
    .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);