CA1839: Process.GetCurrentProcess().MainModule.FileName の代わりに Environment.ProcessPath を使用する

プロパティ
ルール ID CA1839
Title Process.GetCurrentProcess().MainModule.FileName の代わりに Environment.ProcessPath を使用する
[カテゴリ] パフォーマンス
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

Environment.ProcessPath の代わりに、プロセスを起動したファイルへのパスを取得するために Process.GetCurrentProcess().MainModule.FileName を使用します。

規則の説明

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName はコストがかかります。

  • Process およびProcessModule インスタンスを割り当てるのは、通常 FileName を取得するためだけです。
  • パフォーマンスに影響を及ぼすため、Process インスタンスを破棄する必要があります。
  • Process インスタンスで Dispose() を呼び出すことは忘れられがちです。
  • FileName 以外で Process インスタンスを使用しない場合は、参照される型のグラフが増えることによって、関係するサイズが不必要に大きくなります。
  • この API を発見または検出するのは少し困難です。

System.Environment.ProcessPath は、これらの欠点を回避し、同じ情報を生成します。

注意

System.Environment.ProcessPath は .NET 6 以降で使用できます。

違反の修正方法

違反は手動で修正するか、場合によっては、Visual Studio でクイック アクションを使用してコードを修正することができます。

次の 2 つのコード スニペットは、規則違反とその修正方法の例を示しています。

using System.Diagnostics;

class MyClass
{
    void MyMethod()
    {
        string path = Process.GetCurrentProcess().MainModule.FileName; // Violation occurs
    }
}
Imports System.Diagnostics

Class MyClass
    Private Sub MyMethod()
        Dim path As String = Process.GetCurrentProcess().MainModule.FileName ' Violation occurs.
    End Function
End Class
using System.Diagnostics;

class MyClass
{
    void MyMethod()
    {
        string path = System.Environment.ProcessPath; // Violation fixed
    }
}
Imports System.Diagnostics

Class MyClass
    Private Sub MyMethod()
        Dim path As String = System.Environment.ProcessPath ' Violation fixed.
    End Function
End Class

ヒント

Visual Studio では、この規則に対するコード修正を使用できます。 これを使用するには、違反にカーソルを置き、Ctrl+. (ピリオド) を押します。 表示されるオプションの一覧から、 ['Environment.ProcessPath' を使用する] を選択します。

Code fix for CA1839 - Use 'Environment.ProcessPath'

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

不要な割り当ておよび ProcessProcessModule インスタンスの最終的な破棄によるパフォーマンスへの影響が懸念されない場合は、この規則違反を抑制しても問題ありません。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1839
// The code that's violating the rule is on this line.
#pragma warning restore CA1839

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1839.severity = none

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

関連項目