CA1837:Process.GetCurrentProcess().Id の代わりに Environment.ProcessId を使用します
プロパティ | 値 |
---|---|
ルール ID | CA1837 |
Title | Process.GetCurrentProcess().Id の代わりに Environment.ProcessId を使用します |
[カテゴリ] | パフォーマンス |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | 提案として |
原因
この規則は、System.Diagnostics.Process.GetCurrentProcess().Id
の呼び出しを検索し、より効率的であるため、代わりに System.Environment.ProcessId
を使用することを提案します。
規則の説明
System.Diagnostics.Process.GetCurrentProcess().Id
はコストがかかります。
- Process インスタンスを割り当てるのは、通常
Id
を取得するためだけです。 - パフォーマンスに影響を及ぼすため、Process インスタンスを破棄する必要があります。
- Process インスタンスで Dispose() を呼び出すことは忘れられがちです。
Id
以外でProcess
インスタンスを使用しない場合は、参照される型のグラフが増えることによって、関係するサイズが不必要に大きくなります。- この API を発見または検出するのは少し困難です。
System.Environment.ProcessId
は上記すべてを回避します。
注意
規則 CA1837 は、.NET 5.0 以降で利用できます。
違反の修正方法
違反は手動で修正するか、場合によっては、Visual Studio でクイック アクションを使用してコードを修正することができます。
次の 2 つのコード スニペットは、規則違反とその修正方法の例を示しています。
using System.Diagnostics;
class MyClass
{
void MyMethod()
{
int pid = Process.GetCurrentProcess().Id;
}
}
Imports System.Diagnostics
Class MyClass
Private Sub MyMethod()
Dim pid As Integer = Process.GetCurrentProcess().Id
End Function
End Class
using System.Diagnostics;
class MyClass
{
void MyMethod()
{
int pid = System.Environment.ProcessId;
}
}
Imports System.Diagnostics
Class MyClass
Private Sub MyMethod()
Dim pid As Integer = System.Environment.ProcessId
End Function
End Class
ヒント
Visual Studio では、この規則に対するコード修正を使用できます。 これを使用するには、違反にカーソルを置き、Ctrl+. (ピリオド) を押します。 表示されるオプションの一覧から ['Process.GetCurrentProcess().Id' の代わりに 'Environment.ProcessId' を使用する] を選択します。
どのようなときに警告を抑制するか
不要な割り当ておよび Process インスタンスの最終的な破棄によるパフォーマンスへの影響が懸念されない場合は、この規則違反を抑制しても問題ありません。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA1837
// The code that's violating the rule is on this line.
#pragma warning restore CA1837
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA1837.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
関連項目
.NET