Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1837 |
| Заголовок | Используйте Environment.ProcessId вместо Process.GetCurrentProcess().Id. |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Это правило находит вызовы к 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.