Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1839 |
| Заголовок | Используйте Environment.ProcessPath вместо Process.GetCurrentProcess(). MainModule.FileName |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Использование Process.GetCurrentProcess().MainModule.FileName для получения пути к файлу, который запустил процесс, вместо Environment.ProcessPath.
Описание правила
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName является ресурсоемким:
- Обычно выделяют экземпляры Process и ProcessModule, только для того, чтобы получить
FileName. - Экземпляр Process должен быть удалён, что оказывает влияние на производительность.
- Легко забыть о вызове Dispose() для экземпляра Process.
- Если ничего, кроме
FileName, не использует экземплярProcess, то излишнее увеличение размера происходит за счёт увеличения графа ссылаемых типов. - Обнаружить или найти этот API довольно сложно.
System.Environment.ProcessPath позволяет избежать всех этих недостатков и предоставляет ту же информацию.
Примечание.
System.Environment.ProcessPath предоставляется, начиная с версии .NET 6.
Устранение нарушений
Нарушение можно устранить вручную. В некоторых случаях для исправления кода в Visual Studio можно использовать быстрые действия.
В следующих двух фрагментах кода показано нарушение правила и способы его устранения:
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
Совет
Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите Ctrl+. (точка). Выберите Use 'Environment.ProcessPath' из списка предложенных вариантов.
Когда лучше отключить предупреждения
Можно безопасно подавить уведомление о нарушении этого правила, если вас не беспокоит влияние на производительность из-за ненужного выделения и последующего удаления экземпляров Process и ProcessModule.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1839
// The code that's violating the rule is on this line.
#pragma warning restore CA1839
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1839.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.