Compartilhar via


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

Property Valor
ID da regra CA1839
Título Use Environment.ProcessPath em vez de Process.GetCurrentProcess().MainModule.FileName
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Usar 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 uma instância Process e ProcessModule, geralmente apenas para obter o FileName.
  • A instância Process precisa ser descartada, o que tem um impacto no desempenho.
  • É fácil esquecer de chamar Dispose() na instância Process.
  • Se nada mais além de FileName usar a instância Process, o tamanho vinculado aumentará desnecessariamente aumentando o grafo de tipos referenciados.
  • É um pouco difícil descobrir ou localizar essa API.

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

Observação

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 snippets 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

Dica

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

Code fix for CA1839 - Use 'Environment.ProcessPath'

Quando suprimir avisos

É seguro suprimir uma violação dessa regra se você não estiver preocupado com o impacto no desempenho causado pela alocação desnecessária e eventual descarte das instâncias Process e ProcessModule.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

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

Confira também