Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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
Arrays Visual Basic创建数组的最佳实现_Arrays_Vb.net_Performance - Fatal编程技术网

Arrays Visual Basic创建数组的最佳实现

Arrays Visual Basic创建数组的最佳实现,arrays,vb.net,performance,Arrays,Vb.net,Performance,因此,在浏览了MSDN的文档之后,我就开始胡思乱想(请不要向我开枪)看看什么是更快的阵列实现 该条规定: 在声明和初始化基本数据类型的数组时使用{}语法。>例如,使用以下语法: Dim letters5() As String = {"a", "b", "c"} Dim letters6(2) As String letters6(0) = "a" letters6(1) = "b

因此,在浏览了MSDN的文档之后,我就开始胡思乱想(请不要向我开枪)看看什么是更快的阵列实现

该条规定:

在声明和初始化基本数据类型的数组时使用{}语法。>例如,使用以下语法:

   Dim letters5() As String = {"a", "b", "c"}
   Dim letters6(2) As String
   letters6(0) = "a"
   letters6(1) = "b"
   letters6(2) = "c"`
不要使用以下语法:

   Dim letters5() As String = {"a", "b", "c"}
   Dim letters6(2) As String
   letters6(0) = "a"
   letters6(1) = "b"
   letters6(2) = "c"`
我知道这篇文章是在编码约定的背景下编写的,不一定是为了提高速度/效率而编写的,但假设我在dotnetfiddle中测试正确,Microsoft提示您不要使用的后一种语法会更快,对吗


有意思。查看LINQPad中生成的IL(不确定这与正常编译相比如何-我假设它是相同的,但可能是错误的),用于初始化数组的两种方法的IL略有不同

Dim letters5() As String = {"a", "b", "c"}
vs


第一个版本似乎为数组创建了一个临时变量,并将引用复制到实际变量,这需要两条额外的指令。因此,它似乎效率较低,但我认为在正常使用中,更好的代码是值得权衡的。

生成的CIL(MSIL)在这两个示例之间的比较如何?对不起,你刚才说得太过分了。我不知道如何访问它,老实说,谷歌在过去一个小时里对我没有太大的帮助。正如戴怀疑的那样,如果将两个代码片段都添加到一个方法中,编译它并使用Redgate Reflector重新创建源代码,我会得到
Dim letters5 As String()=新字符串(){“a”、“b”、“c”}
Dim letters6 As String())=新字符串(){“a”、“b”、“c”}
。换句话说,这两个代码段都产生相同的可执行代码。您应该能够从dotnetfiddle中查看CIL,不是吗?点击“查看IL”按钮。啊哈,找到了。有趣的。:)我很好奇C#的编译器是否使用其等效语法生成相同的输出。@Dai看起来确实如此,尽管我不得不在LINQPad中禁用优化,否则单行版本被优化掉了,这在开始时添加了一个额外的
nop
。:-)嗯,个人喜好,但是我觉得第二个版本看起来更好。至少在未经训练的人看来是这样。无论如何,很高兴知道,除非它是一个大数组,否则它不会有太大的影响。谢谢大家的帮助@AlexGravely我不相信数组大小对开销有任何影响——不管怎样,都是两条额外的指令(是基准测试中的循环造成了差异,所以数组的数量是您应该考虑的)。对于您所使用的,我将以个人偏好或团队标准进行,但第一个好处是,如果您想在中间插入一个值,则不必与其他索引混淆。你总是可以用任何看起来最令人满意的方式将值分割成多行。啊,我明白了。再次感谢!
IL_0000:  ldc.i4.3    
IL_0001:  newarr      System.String
IL_0006:  stloc.0     // letters6
IL_0007:  ldloc.0     // letters6
IL_0008:  ldc.i4.0    
IL_0009:  ldstr       "a"
IL_000E:  stelem.ref  
IL_000F:  ldloc.0     // letters6
IL_0010:  ldc.i4.1    
IL_0011:  ldstr       "b"
IL_0016:  stelem.ref  
IL_0017:  ldloc.0     // letters6
IL_0018:  ldc.i4.2    
IL_0019:  ldstr       "c"
IL_001E:  stelem.ref  
IL_001F:  ret