CA1877:使用“Path.Combine”或“Path.Join”重载

资产 价值
规则 ID CA1877
标题 使用 Path.CombinePath.Join 重载
类别 性能
修复是中断修复还是非中断修复 Non-breaking
在 .NET 10 中默认启用 作为建议

原因

多个连续 Path.Combine 作或 Path.Join 作用于生成路径。

规则说明

使用多个连续 Path.CombinePath.Join 作时,使用接受多个路径段的重载会更有效。 此方法可减少分配和函数调用的数量,从而提高性能。 这两种方法都提供接受多个参数的重载,使你可以将连续作折叠到单个调用中。

如何修复违规行为

使用接受所有路径段的重载将连续 Path.CombinePath.Join 作替换为单个调用。

自动执行此转换 的代码修复 可用。

Example

以下代码片段显示了 CA1877 的冲突:

public string GetFilePath(string folder, string subfolder, string filename)
{
    // Violation.
    string temp = Path.Combine(folder, subfolder);
    return Path.Combine(temp, filename);
}

public string GetLogPath(string baseDir, string date, string category)
{
    // Violation.
    return Path.Join(Path.Join(baseDir, date), category);
}
Public Function GetFilePath(folder As String, subfolder As String, filename As String) As String
    ' Violation.
    Dim temp As String = Path.Combine(folder, subfolder)
    Return Path.Combine(temp, filename)
End Function

Public Function GetLogPath(baseDir As String, [date] As String, category As String) As String
    ' Violation.
    Return Path.Join(Path.Join(baseDir, [date]), category)
End Function

以下代码片段修复了冲突:

public string GetFilePath(string folder, string subfolder, string filename)
{
    // No violation.
    return Path.Combine(folder, subfolder, filename);
}

public string GetLogPath(string baseDir, string date, string category)
{
    // No violation.
    return Path.Join(baseDir, date, category);
}
Public Function GetFilePath(folder As String, subfolder As String, filename As String) As String
    ' No violation.
    Return Path.Combine(folder, subfolder, filename)
End Function

Public Function GetLogPath(baseDir As String, [date] As String, category As String) As String
    ' No violation.
    Return Path.Join(baseDir, [date], category)
End Function

何时禁止显示警告

如果性能不关心,则禁止显示此规则的警告是安全的。

禁止显示警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1877
// The code that's violating the rule is on this line.
#pragma warning restore CA1877

若要禁用文件、文件夹或项目的规则,请在none中将其严重性设置为

[*.{cs,vb}]
dotnet_diagnostic.CA1877.severity = none

有关详细信息,请参阅 如何禁止显示代码分析警告

另请参阅