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部分的答案:
我得到了这个概念。
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);