CA1837: используйте Environment.ProcessId вместо Process.GetCurrentProcess(). Идентификатор
Свойство | Значение |
---|---|
Идентификатор правила | CA1837 |
Заголовок | Используйте Environment.ProcessId вместо Process.GetCurrentProcess().Id. |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Это правило находит вызовы к System.Diagnostics.Process.GetCurrentProcess().Id
и предлагает использовать вместо него System.Environment.ProcessId
, так как это более эффективно.
Описание правила
System.Diagnostics.Process.GetCurrentProcess().Id
является ресурсоемким:
- Он выделяет экземпляр Process, обычно только для получения
Id
. - Экземпляр Process должен быть удален, что повлияет на производительность.
- Легко забыть о вызове Dispose() в экземпляре Process.
- Если экземпляр
Id
используется толькоProcess
, то увеличение графа ссылаемых типов чрезмерно увеличивает размер. - Обнаружить или найти этот API довольно сложно.
System.Environment.ProcessId
позволяет избежать этих проблем.
Примечание.
Правило CA1837 доступно с версии .NET 5.0.
Устранение нарушений
Нарушение можно устранить вручную. В некоторых случаях для исправления кода в Visual Studio можно использовать быстрые действия.
В следующих двух фрагментах кода показано нарушение правила и способы его устранения:
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
Совет
Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите клавиши CTRL+ (период). Выберите Использовать Environment.ProcessId вместо Process.GetCurrentProcess().Id в списке.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила, если вас не беспокоит влияние ненужных выделений и итоговое удаление экземпляра Process.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1837
// The code that's violating the rule is on this line.
#pragma warning restore CA1837
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1837.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.