Preserveを使うくらいなら配列を使うのをやめたら?VB.NETはじめに弊社のブログで現在一番アクセス数が多いのは(個人的には意外ですが)ReDimの記事です。Preserveには否定的な感じで書いていますが、現在でもこの意見は変わりません。ReDim?ReDimってどういう仕組みで配列の拡張または縮小を行っているのか確認してみましょう。a(2)のコードは以下のコードと等価です。b単純に言ってしまうと、新しいサイズの配列を生成して値をコピーしているだけです。Preserveを使う場面って最初からデータの数が正確に予想できない場合がほとんどだと思います。以下のコードのように入力をバッファする場合、正確な数が予想できないため必要に応じて配列を拡張する必要があります。IfNext入力された値をバッファし、最後に一気に出力しています。T)を使ったバージョン。Console.WriteLine(it)Next余計な変数が1つ消え、めんどくさい添え字計算も省略できています。*2VBの主戦場たる生産性アプリケーションでは基本的にそこまでクリティカルな性能が求められることはなく*3、むしろコードでどこまでドメインを表現できるか・保守性の高いコードであるかが求められると考えています。後述しますが、そのコードでのドメインの表現・保守性を考えると、配列の添え字を操作するよりも適切なコレクションクラスを用いてドメインのセマンティクスをコード上で直接表現したほうが保守性が高くなるのではないでしょうか。使用意図が分かりずらい添え字計算を駆使すれば、配列はキュー*4・スタック・リングバッファー等々のセマンティクスを表現できます。表現できるのはいいのですが、その駆使された添え字計算について後から読まなくてはならないあなたの後任の事も考えてあげましょう。つまるところ、ぐちゃぐちゃな添え字計算を読み取って使用意図をくみ取るのと、専用のコレクションが使われているのを読み取るのでは、将来あなたの後任にとってどちらが楽ですか?という事です。Preserveは新しい領域を確保して値をコピーした後に古い領域をガベージコレクタにブン投げます。Preserveを多用するとメモリアロケーションとガベージコレクションが多発してパフォーマンスに明らかな悪影響を及ぼします。代替手段ほとんどのケースではdocs.microsoft.comの中から適したコレクションクラスを選択するだけで要求を満足するはずです。(古い記事では特に)配列の代替としてArrayListを推しているケースが多いですが、パフォーマンス・型安全の点からみてもジェネリックコレクションと比べたメリットが無いので2秒でゴミ箱にぶち込みましょう。Preserveを使うくらいなら配列を使うのをやめたら?*1:ただし生産性アプリケーションの開発に限る*2:ちなみに、配列版は実はバグがあります。探してみましょう!!*3:もちろん速いに越したことはありませんが、求められる速度はプリミティブなメモリ操作が必要になるほどではないと考えています*4:上のコードの様に*5:具体的にいうと配列のサイズが86キロバイトを超えるケース。»プロフィールid:jyuch一人称が『弊社』なだけで別に所属団体の見解ってわけじゃないからね。(5)はてなブログをはじめよう!jyuchさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。