次の方法で共有


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' を使用する] を選択します。

Code fix for CA1837 - Use 'Environment.ProcessId' instead of 'Process.GetCurrentProcess().Id'

どのようなときに警告を抑制するか

不要な割り当ておよび 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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目