Dela via


CA1839: Använd Environment.ProcessPath i stället för Process.GetCurrentProcess(). MainModule.FileName

Property Värde
Regel-ID CA1839
Title Använd Environment.ProcessPath i stället för Process.GetCurrentProcess(). MainModule.FileName
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Använda Process.GetCurrentProcess().MainModule.FileName för att hämta sökvägen till filen som startade processen i stället för Environment.ProcessPath.

Regelbeskrivning

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName är dyrt:

  • Den allokerar en Process och ProcessModule -instans, vanligtvis bara för att hämta FileName.
  • Instansen Process måste tas bort, vilket har en prestandapåverkan.
  • Det är lätt att glömma att anropa Dispose() instansen Process .
  • Om inget annat än FileName använder instansen Process växer den länkade storleken i onödan genom att öka grafen med typer som refereras till.
  • Det är något svårt att identifiera eller hitta det här API:et.

System.Environment.ProcessPath undviker alla dessa nackdelar och genererar samma information.

Kommentar

System.Environment.ProcessPath är tillgänglig från och med .NET 6.

Så här åtgärdar du överträdelser

Överträdelsen kan antingen åtgärdas manuellt eller i vissa fall med hjälp av snabbåtgärder för att åtgärda kod i Visual Studio.

Följande två kodfragment visar ett brott mot regeln och hur du åtgärdar den:

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

Dricks

En kodkorrigering är tillgänglig för den här regeln i Visual Studio. Om du vill använda den placerar du markören på överträdelsen och trycker på Ctrl+. (punkt). Välj Använd "Environment.ProcessPath" i listan över alternativ som visas.

Code fix for CA1839 - Use 'Environment.ProcessPath'

När du ska ignorera varningar

Det är säkert att förhindra en överträdelse av den här regeln om du inte bryr dig om prestandapåverkan från onödig allokering och eventuell bortskaffande av Process instanserna och ProcessModule .

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även