Бөлісу құралы:


Используйте Environment.ProcessPath вместо Process.GetCurrentProcess().MainModule.FileName.

Свойство Значение
Идентификатор правила 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' из списка предложенных вариантов.

Исправление ошибки CA1839 - использование '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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также