none
配列の宣言方法について RRS feed

  • 質問

  •  基本的な内容かとは思いますが、教えて下さい。 

        Sub Main()
            Dim sample1() As Integer = {1, 2, 3, 4, 5}
            Dim sample2 As Integer() = {1, 2, 3, 4, 5}
            Dim sample3 As Integer() = New Integer() {1, 2, 3, 4, 5}
            '
            Debug.Print("sample1(2) = " & CStr(sample1(2)))
            Debug.Print("sample2(2) = " & CStr(sample2(2)))
            Debug.Print("sample3(2) = " & CStr(sample3(2)))
        End Sub

     今まで、本を頼りに1番目の方法で配列を宣言していましたが、他にも2番目の方法や3番目の方法もあるようですので、比較のために作ったのが上のコードなんですが、出てくる結果は同じでした。

     何か決定的な違いでもあるのでしょうか?

    2006年10月9日 15:40

回答

  • 同じです。

    こういった話は、できあがった IL を見るのが最も確実です。

    2006年10月10日 1:00
  •  LoveDevice1973 さんからの引用
     何か決定的な違いでもあるのでしょうか?

    コードの見た目が決定的に違います

    # けして冗談だけではなくて。 一人でプログラミングしているときは、 どの書き方をするかは好みの問題です。 しかし、 チームでプログラミングしているなら (あるいは、 一人でやっていても、 将来別の人がメンテナンスするなら)、 どの書き方をするか統一しておかないと、 戸惑うことになります。 戸惑うということは、 (わずかではありますが) 生産性が下がるということです。

    で、 何通りかの書き方が出来るとき、 どういう基準で選択するか、 ですが。
    現代では、 可読性を第一に考えるのが主流になっています。 CPU の能力が低く、 メモリ等のリソースが貴重だった過去には、 それらの利用効率を考えるのが第一でした。 今は、 それらよりも、 デバッグやメンテナンスに掛かる人件費 (人月) が高価なことの方が多いため、 コードの読みやすさを優先する考え方が基本になっています。
    今回のようにコードの可読性に差が無いと思われる場合は、 基本的にはその組織の趣味で選んでしまってよいでしょう。

    ただし、 コンパイルして出来上がった実行コードの違いを知っておくことは、 無駄ではありません。
    今でもごくまれではありますが、 実行速度やメモリ使用量をギリギリまでチューニングするという場面が無いではありませんから。 また、 そもそも、 コンパイラはどういう実行コードを作り出してくれるんだろう、 という疑問を持つことは、 プログラマとして重要な資質だと思います。

    さて、  .NET Framework では、 ソースコードをコンパイルすると MSIL (Microsoft Intermediate Language) になります。 MSIL をそのまま読むことはできません (いや、 世の中には読める人もきっと居るとは思います) が、 MSIL アセンブラ言語 (どうも公式名称がはっきりしません。 定義の書いてある asmparse.grammar ファイルにも言語名は書いてないし… ) に逆アセンブルするツールが提供されています。

    話が長くなりました (年寄りの証拠? ) が、 この MSIL 逆アセンブラ (ildasm.exe) を使って、 提示していただいたコードを見てみると、 3つとも全く同じ MSIL にコンパイルされていることが分かります。

    ※ ildasm が Express Edition に含まれていなかったごめんなさい。 そのときは、 Windows SDK (.NET Framework SDK) に入っていたはずですので、 ダウンロードしてください。 ( 現時点の最新版は、 .NET Framework 2.0 Software Development Kit (SDK) (x86) です。 また、 Vista 用のβ版は Windows Software Development Kit for September CTP of Windows Vista and .NET Framework 3.0 Runtime Components です。)

    2006年10月10日 2:08

すべての返信

  • 同じです。

    こういった話は、できあがった IL を見るのが最も確実です。

    2006年10月10日 1:00
  •  LoveDevice1973 さんからの引用
     何か決定的な違いでもあるのでしょうか?

    コードの見た目が決定的に違います

    # けして冗談だけではなくて。 一人でプログラミングしているときは、 どの書き方をするかは好みの問題です。 しかし、 チームでプログラミングしているなら (あるいは、 一人でやっていても、 将来別の人がメンテナンスするなら)、 どの書き方をするか統一しておかないと、 戸惑うことになります。 戸惑うということは、 (わずかではありますが) 生産性が下がるということです。

    で、 何通りかの書き方が出来るとき、 どういう基準で選択するか、 ですが。
    現代では、 可読性を第一に考えるのが主流になっています。 CPU の能力が低く、 メモリ等のリソースが貴重だった過去には、 それらの利用効率を考えるのが第一でした。 今は、 それらよりも、 デバッグやメンテナンスに掛かる人件費 (人月) が高価なことの方が多いため、 コードの読みやすさを優先する考え方が基本になっています。
    今回のようにコードの可読性に差が無いと思われる場合は、 基本的にはその組織の趣味で選んでしまってよいでしょう。

    ただし、 コンパイルして出来上がった実行コードの違いを知っておくことは、 無駄ではありません。
    今でもごくまれではありますが、 実行速度やメモリ使用量をギリギリまでチューニングするという場面が無いではありませんから。 また、 そもそも、 コンパイラはどういう実行コードを作り出してくれるんだろう、 という疑問を持つことは、 プログラマとして重要な資質だと思います。

    さて、  .NET Framework では、 ソースコードをコンパイルすると MSIL (Microsoft Intermediate Language) になります。 MSIL をそのまま読むことはできません (いや、 世の中には読める人もきっと居るとは思います) が、 MSIL アセンブラ言語 (どうも公式名称がはっきりしません。 定義の書いてある asmparse.grammar ファイルにも言語名は書いてないし… ) に逆アセンブルするツールが提供されています。

    話が長くなりました (年寄りの証拠? ) が、 この MSIL 逆アセンブラ (ildasm.exe) を使って、 提示していただいたコードを見てみると、 3つとも全く同じ MSIL にコンパイルされていることが分かります。

    ※ ildasm が Express Edition に含まれていなかったごめんなさい。 そのときは、 Windows SDK (.NET Framework SDK) に入っていたはずですので、 ダウンロードしてください。 ( 現時点の最新版は、 .NET Framework 2.0 Software Development Kit (SDK) (x86) です。 また、 Vista 用のβ版は Windows Software Development Kit for September CTP of Windows Vista and .NET Framework 3.0 Runtime Components です。)

    2006年10月10日 2:08
  •  じゃんぬねっと さんからの引用

    同じです。

    こういった話は、できあがった IL を見るのが最も確実です。

     じゃんぬねっとさん、回答有り難うございます。いつもサイトを拝見させていただいております(理解できているとは言い難いですが…)。

     実は3番目の方法はじゃんぬねっとさんのサイトで書かれていたやり方を参考にさせていただきました。

     2番目の方法も、どこかで「こう書くべきだ」と発言されていた記憶があるのですが、再び探し出せませんでした。人違いでしたらごめんなさい。

     因みにILとはなんでしょうか? ググったら「中間言語」と略すのが正しそうですが…。

    2006年10月10日 3:28
  •  biacさん、回答有り難うございます。

     biac さんからの引用

    コードの見た目が決定的に違います

     違いは見た目だけなんですね。

     MSDN2ライブラリのサンプルコードを見ると、宣言方法が混在してまして、ただし理由までは書いてありませんでした。直感的には、BASICの頃やVBAでは1番の方法を使ってきたので解りやすく、そのまま踏襲していました。

     biac さんからの引用

    # けして冗談だけではなくて。 一人でプログラミングしているときは、 どの書き方をするかは好みの問題です。 しかし、 チームでプログラミングしているなら (あるいは、 一人でやっていても、 将来別の人がメンテナンスするなら)、 どの書き方をするか統一しておかないと、 戸惑うことになります。 戸惑うということは、 (わずかではありますが) 生産性が下がるということです。

     確かに、VBAマクロの延長線上で、個人で書いているので好みで選んでも良さそうですが、ご指摘の通り将来別の人がメンテナンスをする可能性がある以上(あるいは自分自身が将来メンテをするにしても)、統一した方が良さそうですね。

     Webサイトや本などを見て、サンプルコードを引用する際に、そのままの形を使ったりしてしまいがちなのですが、これからは意識して統一させていこうと思います。

     biac さんからの引用

    話が長くなりました (年寄りの証拠? ) が、 この MSIL 逆アセンブラ (ildasm.exe) を使って、 提示していただいたコードを見てみると、 3つとも全く同じ MSIL にコンパイルされていることが分かります。

     私のパソコンにもインストールされておりました (^-^;)

     MSILはちょっと敷居が高そうです (^-^;)

    2006年10月10日 3:48
  •  じゃんぬねっと さんからの引用

    こういった話は、できあがった IL を見るのが最も確実です。

     MSILのILと同じでしょうか?

    2006年10月10日 3:52
  • LoveDevice1973 さん、こんにちは。

     LoveDevice1973 さんからの引用
    因みにILとはなんでしょうか? ググったら「中間言語」と略すのが正しそうですが…。

    MSILのILと同じでしょうか?

    仰るとおりです。

    • IL = Intermediate Language
    • MSIL = Microsoft Intermediate Language

    と、こうなっております。
    わかりにくい説明で申し訳ありませんでした。

    # [回答チェック] は、自身ではなく解決に役に立った方の投稿につけてくださいね。
    # 今回の場合は、biac さんにつけてあげてください。(私は役立たずなので要らないです)

    2006年10月10日 5:22
  •  じゃんぬねっと さんからの引用

    # [回答チェック] は、自身ではなく解決に役に立った方の投稿につけてくださいね。
    # 今回の場合は、biac さんにつけてあげてください。(私は役立たずなので要らないです)

     申し訳ありません、付け間違えていました。もともとじゃんぬねっとさんの回答にも付ける予定でしたので、当初の予定通り付けさせていただきました。

     今後ともよろしくお願いします。

    2006年10月10日 6:23