Partilhar via


CA1839: Use Environment.ProcessPath em vez de Process.GetCurrentProcess().MainModule.FileName

Propriedade valor
ID da regra CA1839
Título Use Environment.ProcessPath em vez de Process.GetCurrentProcess().MainModule.FileName
Categoria Desempenho
A correção causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Como sugestão
Línguas aplicáveis C# e Visual Basic

Motivo

Usando Process.GetCurrentProcess().MainModule.FileName para obter o caminho para o arquivo que iniciou o processo em vez de Environment.ProcessPath.

Descrição da regra

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName é caro:

  • Ele aloca Process e ProcessModule instâncias, geralmente apenas para obter o FileName.
  • A Process instância precisa ser descartada, o que tem um impacto no desempenho.
  • É fácil esquecer de chamar Dispose() na instância Process.
  • Se nada além de FileName usar a instância Process, então o tamanho vinculado aumenta de forma desnecessária ao aumentar o grafo de tipos referenciados.
  • É um pouco difícil descobrir ou encontrar esta API.

System.Environment.ProcessPath evita todas essas desvantagens e produz as mesmas informações.

Nota

System.Environment.ProcessPath está disponível a partir do .NET 6.

Como corrigir violações

A violação pode ser corrigida manualmente ou, em alguns casos, usando ações rápidas para corrigir o código no Visual Studio.

Os dois trechos de código a seguir mostram uma violação da regra e como corrigi-la:

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

Gorjeta

Uma correção de código está disponível para essa regra no Visual Studio. Para utilizá-lo, posicione o cursor sobre a violação e pressione Ctrl+. Escolha Usar 'Environment.ProcessPath' na lista de opções apresentada.

Correção de código para CA1839 - Use 'Environment.ProcessPath'

Quando suprimir avisos

É seguro suprimir uma violação desta regra se não estiveres preocupado com o impacto no desempenho da alocação desnecessária e eventual descarte de instâncias de Process e ProcessModule.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Consulte também