パフォーマンス ルール
パフォーマンス規則は、高パフォーマンスのライブラリとアプリケーションをサポートします。
このセクションの内容
ルール | 説明 |
---|---|
CA1802:適切な場所にリテラルを使用します | フィールドが static および read-only (Visual Basic では Shared および ReadOnly) として宣言され、コンパイル時に計算できる値によって初期化されています。 対象フィールドに代入された値はコンパイル時に計算できるので、宣言を const (Visual Basic では Const) フィールドに変更して、値が実行時ではなくコンパイル時に計算されるようにします。 |
CA1805: 不必要に初期化しない | .NET ランタイムでは、コンストラクターを実行する前に参照型のすべてのフィールドを既定値に初期化します。 ほとんどの場合、フィールドを明示的に既定値に初期化することは冗長であり、メンテナンス コストが増加し、パフォーマンスが低下 (アセンブリのサイズの増加など) する可能性があります。 |
CA1806:メソッドの結果を無視しない | 新しく作成されたオブジェクトが現在まで使用されていないか、新しい文字列を作成して返すメソッドが呼び出されて作成された新しい文字列が現在まで使用されていません。あるいは、コンポーネント オブジェクト モデル (COM) または P/Invoke メソッドから返された HRESULT またはエラー コードが現在まで使用されていません。 |
CA1810:参照型の静的フィールドをインラインで初期化します | 型で明示的な静的コンストラクターを宣言すると、Just-In-Time (JIT) コンパイラが、静的コンストラクターが呼び出されたことを確認するために、型の静的メソッドと静的インスタンス コンストラクターに個別にチェックを追加します。 静的コンストラクターのチェックによってパフォーマンスが低下することがあります。 |
CA1812:インスタンス化されていない内部クラスを使用しません | アセンブリ レベルの型のインスタンスが、アセンブリ内のコードから作成されません。 |
CA1813:アンシールド属性を使用しません | .NET には、カスタム属性を取得するメソッドが用意されています。 既定では、これらのメソッドで属性の継承階層が検索されます。 属性をシールすると、継承階層の全体が検索されなくなるため、パフォーマンスが向上します。 |
CA1814:複数次元の配列ではなくジャグ配列を使用します | ジャグ配列とは、その要素も配列である配列です。 要素を構成する配列のサイズは異なってもよいため、データ セットによっては無駄な空間が少なくなります。 |
CA1815:equals および operator equals を値型でオーバーライドします | 値型の場合、Equals を継承した実装が Reflection ライブラリを使用して、すべてのフィールドの内容を比較します。 Reflection は計算コストが高いため、場合によってはすべてのフィールドで等値性を比較する必要はありません。 ユーザーがインスタンスの比較または並べ替えを行うことや、ハッシュ テーブル キーとしてインスタンスを使用することが予想される場合には、値型に Equals を実装する必要があります。 |
CA1819:プロパティは、配列を返すことはできません | プロパティが読み取り専用であっても、プロパティで返される配列は書き込みから保護されません。 配列の改ざんを防ぐには、プロパティで配列のコピーを返す必要があります。 一般に、このようなプロパティを呼び出すときのパフォーマンス低下は理解されません。 |
CA1820:文字列の長さを使用して空の文字列をテストします | String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列を比較する方法は、Equals を使用する場合よりもはるかに高速です。 |
CA1821:空のファイナライザーを削除します | オブジェクトの有効期間の追跡に関連するパフォーマンス オーバーヘッドが増大するため、ファイナライザーは可能な限り使用しないでください。 空のファイナライザーを使用すると、オーバーヘッドが増大するだけで何の利点もありません。 |
CA1822:メンバーを static に設定します | インスタンス データにアクセスしない、またはインスタンス メソッドを呼び出さないメンバーは、静的 (Visual Basic では Shared) としてマークできます。 メソッドを静的としてマークすると、コンパイラはこれらのメンバーに対する非仮想呼び出しサイトを出力します。 パフォーマンス重視のコードでは、これにより大きくパフォーマンスを向上できます。 |
CA1823:使用されていないプライベート フィールドを使用しません | アセンブリ内でアクセスされていないと思われるプライベート フィールドが検出されました。 |
CA1824:アセンブリを NeutralResourcesLanguageAttribute に設定します | NeutralResourcesLanguage 属性は、リソース マネージャーに対し、アセンブリのニュートラル カルチャのリソースを表示するために使用した言語を通知します。 これにより、読み込んだ最初のリソースに対する検索のパフォーマンスが向上し、ワーキング セットを縮小できます。 |
CA1825:長さ 0 の配列割り当てを回避します | 長さ 0 の配列を初期化すると、不要なメモリ割り当てが発生します。 代わりに、Array.Empty を呼び出して、静的に割り当てられた空の配列インスタンスを使用してください。 メモリ割り当ては、このメソッドのすべての呼び出しで共有されます。 |
CA1826:Linq の列挙可能なメソッドの代わりにプロパティを使用します | Enumerable LINQ メソッドが同等のより効率的なプロパティをサポートする型で使用されました。 |
CA1827:Any が使用できる場合は Count/LongCount を使用しません | Any メソッドの方が効率的な状況で、Count または LongCount メソッドが使用されました。 |
CA1828:AnyAsync が使用できる場合は CountAsync/LongCountAsync を使用しません | AnyAsync メソッドの方が効率的な状況で、CountAsync または LongCountAsync メソッドが使用されました。 |
CA1829:Enumerable. Count メソッドではなく Length/Count プロパティを使用します | Count LINQ メソッドが同等のより効率的な Length または Count プロパティをサポートする型で使用されました。 |
CA1830:StringBuilder の厳密に型指定された Append および Insert メソッドのオーバーロードをお勧めします | Append と Insert では、System.String を超える複数の型に対してオーバーロードを提供します。 可能であれば、ToString() と文字列ベースのオーバーロードを使用するよりも、厳密に型指定されたオーバーロードを優先して使用することをお勧めします。 |
CA1831: 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します | 文字列に対して範囲インデクサーを使用し、その値を ReadOnlySpan<char> 型に暗黙的に割り当てると、Slice の代わりにメソッド Substring が使用されます。これにより、文字列の要求された部分のコピーが生成されます。 |
CA1832: 配列の ReadOnlySpan または ReadOnlyMemory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します | 配列に対して範囲インデクサーを使用し、その値を ReadOnlySpan<T> または ReadOnlyMemory<T> 型に暗黙的に割り当てると、Slice の代わりにメソッド GetSubArray が使用されます。これにより、配列の要求された部分のコピーが生成されます。 |
CA1833: 配列の Span または Memory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します | 配列に対して範囲インデクサーを使用し、その値を Span<T> または Memory<T> 型に暗黙的に割り当てると、Slice の代わりにメソッド GetSubArray が使用されます。これにより、配列の要求された部分のコピーが生成されます。 |
CA1834:1 文字の文字列に対して StringBuilder.Append(char) を使用する | StringBuilder には、引数として char を取る Append オーバーロードがあります。 パフォーマンスを向上させるため、char オーバーロードを呼び出すことをお勧めします。 |
CA1835: 'ReadAsync' および 'WriteAsync' で 'Memory' ベースのオーバーロードを優先的に使用します | 'Stream' には、最初の引数として 'Memory<Byte>' を取る 'ReadAsync' オーバーロードと、最初の引数として 'ReadOnlyMemory<Byte>' を取る 'WriteAsync' オーバーロードがあります。 より効率的なメモリ ベースのオーバーロードを呼び出すことをお勧めします。 |
CA1836: 使用可能な場合は、Count よりも IsEmpty を優先します |
オブジェクトに項目が含まれているかどうかを確認するときは、Count 、Length 、Count<TSource>(IEnumerable<TSource>)、LongCount<TSource>(IEnumerable<TSource>) よりも効率的な IsEmpty プロパティを使用することをお勧めします。 |
CA1837: Process.GetCurrentProcess().Id ではなく Environment.ProcessId を使用します |
Environment.ProcessId は Process.GetCurrentProcess().Id よりも簡単かつ高速です。 |
CA1838: P/Invokes に StringBuilder パラメーターを使用しません |
StringBuilder をマーシャリングすると、ネイティブ バッファーのコピーが常に作成され、1 回のマーシャリング操作に対して複数の割り当てが発生します。 |
CA1839: Process.GetCurrentProcess().MainModule.FileName ではなく Environment.ProcessPath を使用します | Environment.ProcessPath は Process.GetCurrentProcess().MainModule.FileName よりも簡単かつ高速です。 |
CA1840: Thread.CurrentThread.ManagedThreadId ではなく Environment.CurrentManagedThreadId を使用します | Environment.CurrentManagedThreadId は Thread.CurrentThread.ManagedThreadId よりもコンパクトで効率的です。 |
CA1841: Dictionary Contains メソッドを優先します | Keys または Values のコレクションで Contains を呼び出すと、多くの場合、ディクショナリ自体で ContainsKey または ContainsValue を呼び出すよりも負荷が高くなります。 |
CA1842: 1 つのタスクで 'WhenAll' を使用しない | 1 つのタスクで WhenAll を使用すると、パフォーマンスが低下する可能性があります。 代わりにタスクを待機または返します。 |
CA1843: 1 つのタスクで 'WaitAll' を使用しない | 1 つのタスクで WaitAll を使用すると、パフォーマンスが低下する可能性があります。 代わりにタスクを待機または返します。 |
CA1844: 'Stream' のサブクラス化時に、非同期メソッドのメモリベースのオーバーライドを提供する | パフォーマンス向上のため、'Stream' をサブクラス化するときに、メモリベースの非同期メソッドをオーバーライドします。 次に、メモリベースのメソッドの観点から配列ベースのメソッドを実装します。 |
CA1845: スパンベースの 'string.Concat' を使用します | Substring と連結演算子の代わりに、AsSpan と string.Concat を使用する方が効率的です。 |
CA1846: AsSpan を Substring より優先します |
AsSpan は Substring よりも効率的です。 Substring が、O(n) 文字列のコピーを行うのに対し、AsSpan はそうせずに、一定のコストがかかります。 AsSpan も、ヒープ割り当てを実行しません。 |
CA1847: 1 文字参照に文字リテラルを使用する | 1 文字を検索するときに String.Contains(string) の代わりに String.Contains(char) を使用します。 |
CA1848: LoggerMessage デリゲートを使用する | パフォーマンスを向上させるには、LoggerMessage デリゲートを使用します。 |
CA1849: 非同期メソッドの場合に非同期メソッドを呼び出す | 既に非同期であるメソッドでは、他のメソッドの呼び出しはその非同期バージョン (存在する場合) に対して行う必要があります。 |
CA1850: 静的メソッドよりも優先 HashData されます ComputeHash |
ComputeHash を呼び出す HashAlgorithm インスタンスを作成および管理するよりも、静的 HashData メソッドを使用する方が効率的です。 |
CA1851: IEnumerable コレクションの複数の列挙体が考えられます |
IEnumerable コレクションの複数の列挙体が考えられます。 複数の列挙を回避する実装の使用を検討してください。 |
CA1852: 内部型をシールする | アセンブリの外部からアクセスできない型で、それに含まれるアセンブリ内にサブタイプがない場合は、シールされません。 |
CA1853: 'Dictionary.ContainsKey(key)' の不要な呼び出し | Dictionary.ContainsKey(key) で Dictionary.Remove(key) を保護する必要はありません。 Dictionary<TKey,TValue>.Remove(TKey) では、キーが存在するかどうかは既にチェックされており、存在しない場合はスローされません。 |
CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' メソッドを優先する | 'ContainsKey' チェックで保護された Dictionary インデクサー アクセスよりも 'TryGetValue' を優先します。 'ContainsKey' とインデクサーではどちらもキーを検索するため、'TryGetValue' を使用すると余分な参照が回避されます。 |
CA1855: Span<T>.Fill() の代わりに Span<T>.Clear() を使用する | Span<T>.Fill(T) を呼び出すよりも Span<T>.Clear() を呼び出して、スパンの要素に既定値を入力する方が効率的です。 |
CA1856: ConstantExpected 属性の使用が正しくない | ConstantExpectedAttribute 属性がパラメーターに正しく適用されていません。 |
CA1857: 最適なパフォーマンスを得るにはパラメーターに定数が必要 | ConstantExpectedAttribute で注釈が付けられたパラメーターに無効な引数が渡されました。 |
CA1858: IndexOf の代わりに StartsWith を使う | String.IndexOf を呼び出すよりも、String.StartsWith を呼び出して、文字列が特定のプレフィックスで始まるかどうかを確認する方が効率的です。 |
CA1859: パフォーマンスの向上のために可能な場合は具象型を使用する | コードで使用されるインターフェイス型または抽象型によって、不要なインターフェイス呼び出しや仮想呼び出しが発生します。 |
CA1860: 'Enumerable.Any()' 拡張メソッドを使用しない | コレクション型にいずれかの要素があるかどうかを判断するには、Enumerable.Any を呼び出すより、Length 、Count 、または IsEmpty を使う方が効率的で明確です (可能な場合)。 |
CA1861: 引数として定数配列を使用しない | 引数として渡される定数配列は再利用されないため、パフォーマンスのオーバーヘッドを意味します。 パフォーマンス向上のために、それらを "静的な読み取り専用" フィールドに抽出することを検討してください。 |
CA1862: 'StringComparison' メソッドのオーバーロードを使用して大文字と小文字を区別しない文字列比較を実行する | コードから ToLower() または ToUpper() を呼び出して大文字と小文字を区別しない文字列比較を実行すると、不要な割り当てが実行されます。 |
CA1863: 'CompositeFormat' を使用する | 書式設定のコストを削減するには、CompositeFormat インスタンスをキャッシュし、String.Format または StringBuilder.AppendFormat の引数として使います。 |
CA1864: 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する | Dictionary<TKey,TValue>.ContainsKey(TKey) と Dictionary<TKey,TValue>.Add は両方とも検索を実行しますが、これは冗長です。 Dictionary<TKey,TValue>.TryAdd を呼び出すと、値が追加されたかどうかを示す bool が返されるため、より効率的です。 キーが既に存在する場合、TryAdd はキーの値を上書きしません。 |
CA1865-CA1867: char オーバーロードを使用します | char オーバーロードは、単一の char を含む文字列のパフォーマンスに優れたオーバーロードです。 |
CA1868: セットに対する 'Contains' の不要な呼び出し | ISet<T>.Add(T) と ICollection<T>.Remove(T) は両方とも検索を実行するため、ICollection<T>.Contains(T) の事前の呼び出しは冗長になります。 Add(T) または Remove(T) を直接呼び出すと、項目が追加されたか削除されたかを示すブール値が返されるため、より効率的です。 |
CA1869: 'JsonSerializerOptions' インスタンスのキャッシュおよび再利用 | シリアル化または逆シリアル化に JsonSerializerOptions のローカル インスタンスを使用すると、コードが複数回実行されたときに、アプリケーションのパフォーマンスが大幅に低下する可能性があります。これは、System.Text.Json によって、シリアル化関連のメタデータが指定されたインスタンスに内部的にキャッシュされるためです。 |
CA1870: キャッシュされた 'SearchValues' インスタンスを使用してください | キャッシュされた SearchValues<T> インスタンスを使用すると、値を 'IndexOfAny' または 'ContainsAny' に直接渡すよりも効率的です。 |
CA1871: 'ArgumentNullException.ThrowIfNull' に null 許容構造体を渡さないでください | 'ArgumentNullException.ThrowIfNull' は 'object' を受け入れるため、null 許容構造体を渡すと、値がボックス化される可能性があります。 |
CA1872: 'BitConverter.ToString' に基づく呼び出しチェーンよりも、'Convert.ToHexString' と 'Convert.ToHexStringLower' を優先する | バイトを 16 進文字列表現にエンコードする場合は、 Convert.ToHexString または Convert.ToHexStringLower を使用します。 これらのメソッドは、ダッシュとString.ToLowerを置き換えるString.Replaceと組み合わせてBitConverter.ToStringを使用するよりも効率的で割り当てに優れています。 |
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET