次の方法で共有


"Microsoft 基本正確性規則" コード分析規則セット

"Microsoft 基本正確性規則" コード分析規則セットでは、フレームワーク API の使用における論理エラーとよくある間違いに焦点を当てています。 "基本正確性規則" には、"Microsoft 最小推奨規則" 規則セット内の規則が含まれます。 詳細については、「"Microsoft 最小推奨規則" コード分析規則セット」を参照してください。この規則セットは、最小推奨規則で報告された警告の一覧から、さらに詳しい情報へと掘り下げる必要がある場合に使用してください。

"Microsoft 基本正確性規則" 規則セット内のすべての規則について、以下の表で説明します。

規則

説明

CA1008: Enums は 0 値を含んでいなければなりません

初期化されていない列挙型の既定値は、他の値型と同様に、ゼロです。 フラグではない属性が付いた列挙型では、ゼロの値を持つメンバーを定義する必要があります。これは、既定の値を有効な列挙値にするためです。 FlagsAttribute 属性を適用した列挙型でゼロ値のメンバーを定義する場合、名前を "None" にして、列挙型に設定済みの値がないことを示します。

CA1013: オーバーロードする加算および減算で、演算子 equals をオーバーロードします

パブリック型またはプロテクト型で、等値演算子を実装しないまま、加算演算子または減算演算子を実装しています。

CA1303: ローカライズされたパラメーターとしてリテラルを渡さないでください

外部から参照できるメソッドが、.NET Framework クラス ライブラリのコンストラクターまたはメソッドへのパラメーターとして、リテラル文字列を渡しています。その文字列はローカライズできません。

CA1308: 文字列を大文字に標準化します

文字列は大文字に正規化する必要があります。 小文字への変換時に 1 つの小さい文字グループをラウンド トリップさせることができません。

CA1806: メソッドの結果を無視しない

新しく作成されたオブジェクトが現在まで使用されていないか、新しい文字列を作成して返すメソッドが呼び出されて作成された新しい文字列が現在まで使用されていません。あるいは、COM または P/Invoke メソッドから返された HRESULT またはエラー コードが現在まで使用されていません。

CA1816: GC.SuppressFinalize を正しく呼び出します

Dispose を実装するメソッドが GC.SuppressFinalize を呼び出していないか、Dispose を実装しないメソッドが GC.SuppressFinalize を呼び出しています。または、あるメソッドが GC.SuppressFinalize を呼び出し、this (Visual Basic では Me) 以外のオブジェクトを渡しています。

CA1819: プロパティは、配列を返すことはできません

プロパティが読み取り専用であっても、プロパティで返される配列は書き込みから保護されません。 配列の改ざんを防ぐには、プロパティで配列のコピーを返す必要があります。 一般に、このようなプロパティを呼び出すときのパフォーマンス低下は理解されません。

CA1820: 文字列の長さを使用して空の文字列をテストします

String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列を比較する方法は、Equals を使用する場合よりもはるかに高速です。

CA1903: 対象のフレームワークから API のみを使用します

メンバーまたは型が、プロジェクトの対象のフレームワークに含まれていない Service Pack で導入されたメンバーまたは型を使用しています。

CA2004: GC.KeepAlive への呼び出しを削除します

SafeHandle の使用に変更する場合、すべての GC.KeepAlive (object) の呼び出しを削除します。 この場合、クラスに GC.KeepAlive の呼び出しを含めることはできません。クラスはファイナライザーを持っていない代わりに、SafeHandle を使用して OS ハンドルを終了していることが前提となっています。

CA2006: SafeHandle を使用して、ネイティブ リソースを要約します

マネージ コードで IntPtr を使用すると、セキュリティ上の問題および信頼性の問題が発生する可能性があります。 すべての IntPtr の使用状況をチェックして、SafeHandle または類似のテクノロジに置き換える必要があるかどうかを判断してください。

CA2102: 汎用ハンドラーの CLSCompliant でない例外をキャッチします

アセンブリ内の RuntimeCompatibilityAttribute でマークされていないメンバーまたは RuntimeCompatibility(WrapNonExceptionThrows = false) でマークされているメンバーには、System.Exception を処理する catch ブロックがあり、その直後に汎用 catch ブロックはありません。

CA2104: 読み取り専用の変更可能な参照型を宣言しません

外部から参照できる型に、変更可能な参照型である、外部から参照可能な読み取り専用のフィールドがあります。 変更可能な型とは、インスタンス データを変更できる型です。

CA2105: 配列フィールドは読み取り専用にできません

配列を含むフィールドに読み取り専用 (Visual Basic では ReadOnly) 修飾子を適用すると、そのフィールドで参照先の配列を変更できません。 ただし、読み取り専用フィールドに格納された配列の要素は変更できます。

CA2106: アサートをセキュリティで保護します

メソッドによってアクセス許可がアサートされますが、呼び出し元に対してセキュリティ チェックが実行されていません。 セキュリティ チェックを実行せずにセキュリティ アクセス許可をアサートすると、悪用される可能性があるセキュリティの弱点がコード内に残る場合があります。

CA2115: ネイティブ リソースを使用しているときには GC.KeepAlive を呼び出します

この規則では、アンマネージ コードでまだ使用されているのに、アンマネージ リソースが終了されたときに発生する可能性のあるエラーを検出します。

CA2119: プライベート インターフェイスを満たすメソッドをシールします

継承可能なパブリック型により、internal (Visual Basic では Friend) インターフェイスのオーバーライド可能なメソッド実装が提供されます。 この規則違反を修正するには、アセンブリの外側でメソッドがオーバーライドされないようにします。

CA2120: シリアル化コンストラクターをセキュリティで保護します

この型には、System.Runtime.Serialization.SerializationInfo オブジェクトおよび System.Runtime.Serialization.StreamingContext オブジェクトを使用するコンストラクター (シリアル化コンストラクターのシグネチャ) があります。 このコンストラクターはセキュリティ チェックで保護されていませんが、型に含まれる標準コンストラクターの 1 つ以上は保護されています。

CA2121: 静的コンストラクターはプライベートでなければなりません

システムで静的コンストラクターが呼び出されてから、型の最初のインスタンスが作成されるか、静的メンバーが参照されます。 静的コンストラクターがプライベートである場合、システム以外のコードから呼び出すことができます。 コンストラクターで実行される操作によっては、これによって予期しない動作が発生することがあります。

CA2205: Win32 API に相当するマネージ API を使用します

プラットフォーム呼び出しメソッドが定義されましたが、同等の機能を持つメソッドが .NET Framework クラス ライブラリに存在します。

CA2215: Dispose メソッドから基本クラスの破棄を呼び出します

型が、破棄できる型から継承している場合、使用している Dispose メソッド内から基本型の Dispose メソッドを呼び出す必要があります。

CA2221: ファイナライザーは保護されなければなりません

ファイナライザーは、ファミリ アクセス修飾子を使用する必要があります。

CA2222: 継承されたメンバーの参照範囲を縮小しません

継承メンバーのアクセス修飾子は変更しないでください。 継承メンバーをプライベートに変更しても、呼び出し元はメソッドの基本クラスの実装にアクセスできます。

CA2223: メンバーは、戻り値の型以外にも異なる点がなければなりません

共通言語ランタイムでは、戻り値の型以外は同じであるメンバーの区別に戻り値の型を使用することが許可されていますが、この機能は共通言語仕様ではなく、.NET プログラミング言語の共通機能でもありません。

CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします

パブリック型で等値演算子が実装されていますが、Object.Equals がオーバーライドされていません。

CA2226: 演算子は対称型オーバーロードを含まなければなりません

型で等値演算子または非等値演算子を実装し、逆の働きをする演算子を実装していません。

CA2227: Collection プロパティは読み取り専用でなければなりません

書き込み可能なコレクション プロパティにより、ユーザーはコレクションを異なるコレクションで置換できます。 読み取り専用プロパティは、コレクションを置換できないようにしますが、個別のメンバーが設定されることは回避できません。

CA2231: ValueType.Equals のオーバーライドで、演算子 equals をオーバーロードします

値型は、Object.Equals をオーバーライドしていますが、等値演算子を実装していません。

CA2239: オプションのフィールドに逆シリアル化メソッドを指定します

型に System.Runtime.Serialization.OptionalFieldAttribute 属性でマークされているフィールドがあり、その型に逆シリアル化のイベント処理メソッドがありません。