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' を使用する] を選択します。
どのようなときに警告を抑制するか
不要な割り当ておよび Process や ProcessModule インスタンスの最終的な破棄によるパフォーマンスへの影響が懸念されない場合は、この規則違反を抑制しても問題ありません。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
関連項目
.NET