CA1837: Usar Environment.ProcessId em vez de Process.GetCurrentProcess().Id

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

Causa

Essa regra localiza chamadas para System.Diagnostics.Process.GetCurrentProcess().Id e sugere usar System.Environment.ProcessId como alternativa, pois é mais eficiente.

Descrição da regra

System.Diagnostics.Process.GetCurrentProcess().Id é caro:

  • Ele aloca uma instância Process geralmente apenas para obter o Id.
  • 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 Id 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.ProcessId evita todas as opções acima.

Observação

A regra CA1837 está disponível a partir do .NET 5.0.

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()
    {
        int pid = Process.GetCurrentProcess().Id;
    }
}
Imports System.Diagnostics

Class MyClass
    Private Sub MyMethod()
        Dim pid As Integer = Process.GetCurrentProcess().Id
    End Function
End Class
using System.Diagnostics;

class MyClass
{
    void MyMethod()
    {
        int pid = System.Environment.ProcessId;
    }
}
Imports System.Diagnostics

Class MyClass
    Private Sub MyMethod()
        Dim pid As Integer = System.Environment.ProcessId
    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.ProcessId' em vez de 'Process.GetCurrentProcess(). Id' da lista de opções que é apresentada.

Code fix for CA1837 - Use 'Environment.ProcessId' instead of 'Process.GetCurrentProcess().Id'

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 de uma instância Process.

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 CA1837
// The code that's violating the rule is on this line.
#pragma warning restore CA1837

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.CA1837.severity = none

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

Confira também