値型の使用法のガイドライン
値型は、スタックに格納されたビット シーケンスとして表される値を示します。.NET Framework のすべての組み込みデータ型の詳細については、「値型」を参照してください。ここでは、構造体 (struct) 値型と列挙体 (enum) 値型を使用するときのガイドラインを説明します。
構造体の使用方法のガイドライン
次の基準のいずれかに一致する型には、struct を使用することをお勧めします。
- プリミティブ型と同様に機能する。
- 16 バイトより小さなサイズのインスタンスを持つ。
- 不変である。
- 値のセマンティクスが要件を満たしている。
適切に定義された構造体の例を次に示します。
Public Structure Int32
Implements IFormattable
Implements IComparable
Public Const MinValue As Integer = -2147483648
Public Const MaxValue As Integer = 2147483647
Private intValue As Integer
Overloads Public Shared Function ToString(i As Integer) As String
' Insert code here.
End Function
Overloads Public Function ToString(ByVal format As String, ByVal
formatProvider As IFormatProvider) As String Implements
IFormattable.ToString
' Insert code here.
End Function
Overloads Public Overrides Function ToString() As String
' Insert code here.
End Function
Public Shared Function Parse(s As String) As Integer
' Insert code here.
Return 0
End Function
Public Overrides Function GetHashCode() As Integer
' Insert code here.
Return 0
End Function
Public Overrides Overloads Function Equals(obj As Object) As Boolean
' Insert code here.
Return False
End Function
Public Function CompareTo(obj As Object) As Integer Implements
IComparable.CompareTo
' Insert code here.
Return 0
End Function
End Structure
[C#]
public struct Int32: IComparable, IFormattable
{
public const int MinValue = -2147483648;
public const int MaxValue = 2147483647;
public static string ToString(int i)
{
// Insert code here.
}
public string ToString(string format, IFormatProvider formatProvider)
{
// Insert code here.
}
public override string ToString()
{
// Insert code here.
}
public static int Parse(string s)
{
// Insert code here.
return 0;
}
public override int GetHashCode()
{
// Insert code here.
return 0;
}
public override bool Equals(object obj)
{
// Insert code here.
return false;
}
public int CompareTo(object obj)
{
// Insert code here.
return 0;
}
}
- struct には、既定のコンストラクタを提供しないでください。C# では、struct に既定のコンストラクタを格納することができません。ランタイムにより、すべての値をゼロの状態に初期化するコンストラクタが挿入されます。これにより、各インスタンスにコンストラクタを実行しなくても、struct の配列を作成できます。struct を、各インスタンスに対して呼び出されるコンストラクタに依存させないでください。struct のインスタンスは、コンストラクタを実行しなくても、ゼロ値を使用して作成できます。また、すべてのインスタンス データがゼロ、false、または null (いずれか適切な値) に設定された状態が有効になるように、struct をデザインする必要もあります。
列挙型 (Enum) の使用方法のガイドライン
次の規則は、列挙型の使用方法のガイドラインを示しています。
enum 型に
Enum
サフィックスを適用しないでください。enum を使用して、パラメータ、プロパティ、および戻り値の型を厳密に指定します。パラメータまたはプロパティで使用する列挙値は、常に enum を使用して定義します。これによって、開発ツールが、プロパティまたはパラメータに対して有効な値を判断できます。列挙型を定義する方法を次の例に示します。
Public Enum FileMode Append Create CreateNew Open OpenOrCreate Truncate End Enum [C#] public enum FileMode { Append, Create, CreateNew, Open, OpenOrCreate, Truncate }
FileMode 列挙型を使用する FileStream オブジェクトのコンストラクタの例を次に示します。
Public Sub New(ByVal path As String, ByVal mode As FileMode); [C#] public FileStream(string path, FileMode mode);
最終的な静的ファイナル定数の代わりに enum を使用します。
オペレーティング システムのバージョンなど、公開されている一連の値には enum を使用しないでください。
数値に対してビットごとの OR 演算が実行される場合にだけ、System.FlagsAttribute クラスを使用して、enum のカスタム属性を作成します。enum 値に 2 の累乗を使用し、簡単に結合できるようにします。この属性は、次のコード例で適用されています。
<Flags()> Public Enum WatcherChangeTypes Created = 1 Deleted = 2 Changed = 4 Renamed = 8 All = Created Or Deleted Or Changed Or Renamed End Enum [C#] [Flags()] public enum WatcherChangeTypes { Created = 1, Deleted = 2, Changed = 4, Renamed = 8, All = Created | Deleted | Changed | Renamed };
**メモ **この規則の例外は、Win32 API をカプセル化する場合です。通常、Win32 ヘッダーから取得した内部定義を使用します。これらについては、Win32 における大文字の使用スタイルを維持します。通常は、すべて大文字です。
よく使用されるフラグの組み合わせに、名前付きの定数を与えることを考慮します。ビットごとの OR 演算は高度な概念なので、単純なタスクでは実行しないでください。この方法を次の列挙型の例で示します。
<Flags()> _ Public Enum FileAccess Read = 1 Write = 2 ReadWrite = Read Or Write End Enum [C#] [Flags()] public enum FileAccess { Read = 1, Write = 2, ReadWrite = Read | Write, }
次のいずれかの条件が当てはまる場合以外は、enum の基になる型として Int32 型を使用します。
- enum がフラグを表し、現在 32 個よりも多くのフラグがあるか、enum が表すフラグの数が今後増える可能性がある。
- 下位互換性を維持するために、int 以外の型が必要である。
enum 引数が定義済みの範囲内に収まることを前提とはしないでください。enum で値が定義されていない場合でも、任意の整数値を enum にキャストすることは有効です。次のコード例で示すように、引数の検証を実行してください。
Public Sub SetColor(newColor As Color) If Not [Enum].IsDefined(GetType(Color), newColor) Then Throw New ArgumentOutOfRangeException() End If End Sub [C#] public void SetColor (Color color) { if (!Enum.IsDefined (typeof(Color), color) throw new ArgumentOutOfRangeException(); }