Vb.net 所有这些数组的声明方式有什么不同吗?

Vb.net 所有这些数组的声明方式有什么不同吗?,vb.net,Vb.net,所有这些陈述都是等价的吗 我是从你那儿得到的 为什么vb.net允许有这么多方法来声明和初始化数组?建议采用哪种方式?问题1:所有这些说法都是等效的吗? 为了解决你的问题,我们在VB .NET中考虑以下问题: Dim chars1 = {"%"c, "&"c, "@"c} Dim chars2 As Char() = {"%"c, "&"c, "@"c} D

所有这些陈述都是等价的吗

我是从你那儿得到的

为什么vb.net允许有这么多方法来声明和初始化数组?建议采用哪种方式?

问题1:所有这些说法都是等效的吗? 为了解决你的问题,我们在VB .NET中考虑以下问题:

Dim chars1 = {"%"c, "&"c, "@"c}
Dim chars2 As Char() = {"%"c, "&"c, "@"c}

Dim chars3() As Char = {"%"c, "&"c, "@"c}
Dim chars4 As Char() = New Char(2) {"%"c, "&"c, "@"c}
Dim chars5() As Char = New Char(2) {"%"c, "&"c, "@"c}
在将其编译为IL时,我们首先得到以下各项的本地声明:

Dim chars1 = {"%"c, "&"c, "@"c}
Dim chars2 As Char() = {"%"c, "&"c, "@"c}
Dim chars3() As Char = {"%"c, "&"c, "@"c}
Dim chars4 As Char() = New Char(2) {"%"c, "&"c, "@"c}
Dim chars5() As Char = New Char(2) {"%"c, "&"c, "@"c}
然后,用初始值加载这些值的IL,对于
chArray1
,为:

.locals init (
    [0] char[] chArray1,
    [1] char[] chArray2,
    [2] char[] chArray3,
    [3] char[] chArray4,
    [4] char[] chArray5
)
IL_0001:ldc.i4.3
IL_0002:newarr[mscorlib]System.Char
IL_0007:dup
IL_0008:ldtoken字段值类型“”/“\uuuu StaticArrayInitTypeSize=6'::“6845D198C7136E509FE40D35A01FF939DFB57BECB075C9878949317F7D46A9C”
IL_000d:调用void[mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(类[mscorlib]System.Array,值类型[mscorlib]System.RuntimeFieldHandle)
IL_0012:stloc.0
加载另一个数组的IL相同,但堆栈位置每次增加1(
stloc.1
stloc.2
,等等)

所以在回答第一个问题时-是的,这些陈述看起来是等价的

问题2:为什么vb.net允许有这么多方法来声明和初始化数组? 对此的答案有点不太清楚

我的观点是,这很可能是由于从VBA\VBScript\VB6迁移到VB.Net,以及需要为过渡的人保留数组声明的“旧方式”,以及希望使用数组声明的“新方式”


然而,很清楚的是,无论采用何种方法,最终结果都是一样的。

当你自己测试时,你发现了什么?IL是指中间语言,对吗?对这太棒了。大多数人认为这只是一个愚蠢的问题。我想知道引擎盖下面是什么。Great最终结果是一样的,IL也是一样的。为了避免混淆,应该推荐哪种新的delcaration方法?如何获得IL语言内容?@VibiChrisbud IL实际上是指中间语言。您可以使用Visual Studio的内置工具ildasm.exe查看IL。在线上也有一系列免费和付费的工具可以帮助解决这个问题。我看过微软的文档,我不认为有推荐的方法,这意味着这取决于个人品味或观点。我自己的偏好是这样声明:
Dim myVar As Char()
,因为我觉得这更符合我在其他语言中看到的内容。然而,这纯粹是一种意见,而不是一项建议
IL_0001: ldc.i4.3
IL_0002: newarr       [mscorlib]System.Char
IL_0007: dup
IL_0008: ldtoken      field valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=6' '<PrivateImplementationDetails>'::'6845D198C7136E509FE40D35A01FF939DFB57BECCB075C9878949317F7D46A9C'
IL_000d: call         void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)
IL_0012: stloc.0