Поделиться через


CA1839. Использование Environment.ProcessPath вместо Process.GetCurrentProcess().MainModule.FileName

Свойство Значение
Идентификатор правила CA1839
Заголовок Используйте Environment.ProcessPath вместо Process.GetCurrentProcess(). MainModule.FileName
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Использование Process.GetCurrentProcess().MainModule.FileName для получения пути к файлу, который запустил процесс, вместо Environment.ProcessPath.

Описание правила

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName является ресурсоемким:

  • Экземпляр Process и ProcessModule обычно выделяется только для получения FileName.
  • Экземпляр Process должен быть удален, что повлияет на производительность.
  • Легко забыть о вызове Dispose() в экземпляре Process.
  • Если экземпляр Process используется только FileName, то увеличение графа ссылаемых типов чрезмерно увеличивает размер.
  • Обнаружить или найти этот 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+ (период). Выберите Использовать Environment.ProcessPath в списке представленных вариантов.

Code fix for CA1839 - 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

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

См. также