忍者ブログ
  • 2017.09
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 2017.11
vb.netの配列
Arrayコンストラクタに疑問があったので
アセンブラを見てみた。

●VB

Public Sub NewByte(size As Integer)
Dim dimByte(size) As Byte
Dim newByte As Byte() = new Byte(size) {}
End Sub


●VBのアセンブラ

// method line 2
.method public
instance default void NewByte (int32 size) cil managed
{
// Method begins at RVA 0x2068
// Code size 36 (0x24)
.maxstack 2
.locals init (
unsigned int8[] V_0,
unsigned int8[] V_1,
unsigned int8[] V_2)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4.1
IL_0003: add.ovf
IL_0004: newarr [mscorlib]System.Byte
IL_0009: stloc 0


IL_000d: nop
IL_000e: ldarg.1
IL_000f: ldc.i4.1
IL_0010: add.ovf
IL_0011: newarr [mscorlib]System.Byte
IL_0016: stloc 2


IL_001a: ldloc 2

IL_001e: stloc 1

IL_0022: nop
IL_0023: ret
} // end of method TestArray::NewByte


●C#

public void newByte(int size)
{
var b = new byte[size];
}


●C#のアセンブラ

// method line 3
.method public hidebysig
instance default void newByte (int32 size) cil managed
{
// Method begins at RVA 0x20f8
// Code size 8 (0x8)
.maxstack 2
.locals init (
unsigned int8[] V_0)
IL_0000: ldarg.1
IL_0001: newarr [mscorlib]System.Byte
IL_0006: stloc.0

IL_0007: ret
} // end of method TestArray::newByte



うむむ・・。vb.netでのArrayコンストラクタはArrayコンストラクタではないのだ・・・。
PR
【2012/11/11 14:03 】 | .Net Framework | 有り難いご意見(4)
                                    
<<なんとなく覚書 | ホーム | vbncを使ってemacsでコンパイル>>
有り難いご意見
無題
アロケータをコンストラクタと呼ぶのなら逆かしら?


http://msdn.microsoft.com/ja-jp/library/812xyxy2.aspx
【2012/11/12 23:11】| URL | ゼンガイチ #2ac026978f [ 編集 ]


無題
newarrが確保した領域に着目すれば0またはNothingで初期化されるなら広義のコンストラクタと呼んでもいいかも。

配列の参照アドレスを一つ目のフィールドと解釈したら+1するところを含めてコンストラクタともいえるけど、冗長だなぁと・・・。

VBの
Dim newByte As Byte() = new Byte(size) {}

C#の
var b = new byte[size];

は互換性もたせても良かったんじゃないかと思うんですよね・・・。


http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF

http://msdn.microsoft.com/ja-jp/library/system.reflection.emit.opcodes.newarr.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
【2012/11/13 00:05】| | nwpfh #29ef1c5ee9 [ 編集 ]


無題
夜な夜な続きを書きますと

単にVB.NETの配列サイズの指定方法が終値に対してC#はサイズしていなので単純に+1しているだけかと

【2012/11/13 00:31】| URL | ゼンガイチ #2ac026978f [ 編集 ]


無題
うむむ。私の感覚は小数派なんかな。

VB6って
Dim arr(3 To 5)
ReDim arr2(4 To 7)

ってDim () ReDim()の仕様と

後から追加された
new arr(7) {}

って同じ仕様にできないものを
踏襲する意味が分からないなぁと。
いまさらなんだけどねぇ。

newarrは必ず0インデックスはじまりなんだし
new なんとかは要素数で良かったんじゃないかと。

Dim arr(5)
って
Dim arr(0 To 5)が

デフォルトの
Option Base 0
により「0 To 」が省略されたから
Dim arr(5)
↑UBound数だと思うの。

new arr(3 To 5){}
と書ける訳でもないのに
new arr(要素数){}ってならないのは違和感あるんよね。

VB6からVB.Netにするときに
Dim, ReDimは名残りでUBound数。
Newは新しくできたから要素数でも良かったんじゃないかと。

lboundに対応するかもとかありえるなら
C#の方が後発なんだから
a To b を考慮して
newarrrange a b とか対応するとかもあるだろうし。
【2012/11/13 07:16】| | nwpfh #29ef1c5ee9 [ 編集 ]


貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>