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ânciaProcess
, 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.
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.