1

重複の可能性:
C#:構造体とクラス

私は、MP3ファイルのタグを含むデータベースを必要とする比較的小さいライブラリを作成しています。

整数、倍精度浮動小数点数などの固定サイズのデータ​​がある場合は、構造体に固執する方がよいことを知っています...しかし、私の場合、文字列と、文字列、さらには他の構造体を含むリストがあります...構造、それはこのようになります:

Public Structure STitle
    Dim Title As String
    Dim Path As String
End Structure

Public Structure SAlbum
    Dim Album As String
    Dim Songs As List(Of STitle)
End Structure

Public Structure SArtist
    Dim Artist As String
    Dim Albums As List(Of SAlbum)
End Structure

次に、私はこのようなものを持っています:

Public SongLibrary As New List(Of SArtist)

文字列とリストは、特に速度的に私を混乱させます。たくさんの曲を検索するので、最速の曲を使用していることを確認したいと思います。

ボクシングとアンボクシングについても混乱しています。文字列のリストには「文字列」へのポインタのみが含まれており、構造体についても同じであると想定しています(低レベルを考えようとしています)。ただし、サイズを特定できないため(またはそうですか?)、検索を遅くするboxing-unboxing(配列リストを使用しない理由)が発生するかどうかはわかりません。

では、どれを選ぶのですか?クラス、または構造?または他にもっと適したものはありますか?

4

2 に答える 2

7

整数、倍精度浮動小数点数などの固定サイズのデータ​​がある場合は、構造体に固執する方がよいことを知っています。

どうやってわかったの?私の経験では、カスタム値型を作成することはめったに良い考えではありません。それは起こります-たとえば、私の野田時間プロジェクトにはたくさんあります-しかし、通常私は用心深いでしょう。また、可変構造を公開する前に非常に注意する必要があります。

ボクシングとアンボクシングについても混乱しています。文字列のリストには「文字列」へのポインタのみが含まれており、構造体についても同じであると想定しています(低レベルを考えようとしています)。

構造体の場合、ポインター(参照)はありません。たとえば、 AList(Of Integer)はで実装されInteger()ます。配列には値が直接含まれています。ジェネリックコレクションでは、ボクシングは必要ありません。

詳細については、クラスの設計ガイドラインを参照してください。ただし、構造を作成する本当に説得力のある理由がない限り、基本的にはデフォルトでクラスを使用します。

于 2013-01-18T16:46:23.597 に答える
2

文字列とリストは、特に速度的に私を混乱させます。たくさんの曲を検索するので、最速の曲を使用していることを確認したいと思います

あなたの場合、文字列とリストの関係は明確ではありませんが、高速検索は、コレクション内でのデータの配布方法に関連していることがよくあります。

通常、最速は次のとおりです。コレクションを並べ替えて、そのコレクションに対してバイナリ検索を実行します。

特に、高速データ取得の観点からは、構造体を使用しないでください。コレクションからデータ(構造体の場合)を取得する瞬間に、データは別の新しいオブジェクトにコピーされます。クラスの場合、代わりに、ポインタが与えられます(非常に効率的です)。

構造体ではなく参照型(クラス)を使用する

于 2013-01-18T16:48:25.027 に答える