適切なデータ型を選択する
値の型と参照型との違い、および整数型と浮動小数点型との違いの概要がわかりました。
さまざまな型のデータを取得、操作、格納する新しいアプリケーションを構築するとします。 どのデータ型を使いますか?
簡単に選べることもあります。 たとえば、テキストを操作する必要があるときは、大量の連結を行う必要がない限り、既定では string
データ型を使います。
しかし、数値データを操作する場合はどうでしょうか? 11 個の異なるオプションがあります。 適切なデータ型をどのように選択しますか?
適切なデータ型を選択する
選択できるデータ型が多数ある場合、特定の状況に適したデータ型を選択するためにどのような条件を使用する必要がありますか?
オプションを評価する際には、いくつかの重要な考慮事項を検討する必要があります。 多くの場合、正しい答えは 1 つだけではありませんが、一部の答えが他の答えよりも正しい場合があります。
アプリケーションの境界値範囲の要件を満たすデータ型を選択する
データ型を選択すると、その特定の変数に格納する可能性のあるデータのサイズに対して境界を設定するのに役立つ場合があります。 たとえば、特定の変数で 1 から 10,000 の範囲の数値のみを格納する必要があり、そうしないと、予期される数値の境界外となることがわかっている場合、byte
と sbyte
は範囲が小さすぎるので普通は避けます。
さらに、int
、long
、uint
、ulong
は、必要以上に多くのデータを格納できるため、おそらく必要ありません。 同様に、小数部の値が必要でない場合は、float
、double
、decimal
をスキップする場合があります。 short
と ushort
に絞り込むことができ、どちらも使用できる可能性があります。 負の値がアプリケーションでは意味のないことが確実な場合は、ushort
(正の符号なし整数で、0 から 65,535) を選択できます。 ここでは、0 から 65,535 の境界外にある ushort
型の変数に割り当てられたすべての値で例外がスローされるため、アプリケーションである程度のサニティ チェックを適用するのに少しは役立ちます。
最初に、(パフォーマンスの最適化ではなく) データに合うようにデータ型を選ぶ
アプリケーションのパフォーマンスがよくなるだろうと考えて、データの格納に使われるビット数が最も少ないデータ型を選びたくなるかもしれません。 しかし、アプリケーションのパフォーマンス (つまり、アプリケーションの実行速度) に関しては、"早期に最適化" しないことをお勧めします。 アプリケーションのパフォーマンスに影響する可能性があるデータ型の選択など、コードの部分を推測したい気持ちを抑える必要があります。
多くの人は、特定のデータ型ではより少ない情報が格納されるため、より多くの情報を格納するデータ型よりもコンピューターのプロセッサとメモリが少ない方を使用する必要があると推測します。 それよりは、データに適したものを選択する必要があります。その後、パフォーマンスに悪影響を及ぼすアプリケーションの部分に事実に基づく分析情報を提供する特別なソフトウェアを使用して、アプリケーションのパフォーマンスを経験的に測定することができます。
使用するライブラリ関数の入力と出力のデータ型に基づいてデータ型を選択する
2 つの日付間の年の範囲を操作するとします。 アプリケーションはビジネス アプリケーションであるため、だいたい 1,960 から 2,200 の範囲のみが必要であると判断できます。 0 から 255 の数値を表すことができるため、byte
を使ってみようと思うかもしれません。
しかし、System.TimeSpan
クラスと System.DateTime
クラスの組み込みメソッドを見ると、ほとんどの場合、double
型と int
型の値が受け入れられることがわかります。 sbyte
を選択した場合は、常に sbyte
と double
または int
の間でキャストします。 この場合は、1 秒未満の精度が不要な場合は int
を選択し、1 秒未満の精度が必要な場合は double
を選択することをお勧めします。
他のシステムへの影響に基づいてデータ型を選択する
場合によっては、他のアプリケーションやデータベースのような他のシステムで情報がどのように使用されるのかを考慮する必要があります。 たとえば、SQL Server の型システムは、C# の型システムとは異なります。 その結果、そのデータベースにデータを保存する前に、2 つの間の何らかのマッピングを行う必要があります。
アプリケーションの目的がデータベースとのインターフェイスである場合は、データの格納方法と格納されるデータの量を考慮する必要があります。 より大きなデータ型を選ぶと、アプリケーションで生成されるすべてのデータの格納に必要な物理ストレージの量 (およびコスト) に影響する可能性があります。
判断できない場合は基本に従う
いくつかの考慮事項を見てきましたが、まず最初は、わかりやすくするため、次のような基本データ型のサブセットを優先的に使うことをお勧めします。
int
: ほとんどの整数の場合decimal
: 金額を表す数値の場合bool
: true または false の値の場合string
: 英数字の値の場合
特別な状況の場合は特殊な複合型を選択する
特定の目的のためのデータ型が既に存在する場合は、それを作り直さないでください。 次の例では、特定の .NET データ型が役に立つことがある場合を示します。
byte
: 他のコンピューター システムから取得されたエンコード済みデータを操作する場合、または別の文字セットを使用する場合。double
: 幾何学的または科学的な目的で使用する場合。double
は、モーションを伴うゲームを構築するときに頻繁に使用されます。System.DateTime
: 特定の日付と時刻の値の場合。System.TimeSpan
。年/月/日/時/分/秒/ミリ秒の範囲。
要点
コードで使うデータ型を選ぶときは考慮することがあり、多くの場合、複数のオプションがあります。 自分の選択を熟慮し、正当な理由がない限り、int
、decimal
、string
、bool
などの基本的な型を使ってみてください。