CA2234:传递 System.Uri 对象,而不传递字符串

属性
规则 ID CA2234
标题 传递 System.Uri 对象,而不传递字符串
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

已调用具有字符串参数的方法,该字符串参数的名称包含 “uri”、“Uri”、“urn”、“url”或“Url”,而且该方法的声明类型包含一个具有 System.Uri 参数的相应方法重载。

默认情况下,此规则仅查看外部可见的方法和类型,但这是可配置的。

规则说明

参数名称根据 camel 大小写约定拆分为标记,然后此规则会检查每个标记是否为“uri”、“Uri”、“urn”、“Urn”、“url”或“Url”。 如果存在匹配项,则假定参数表示统一资源标识符 (URI)。 URI 的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。 Uri 类以一种安全的方式提供这些服务。 如果在两个重载之间进行选择,而这两个重载只是在 URI 的表示形式方面存在差异,用户应选择采用 Uri 参数的重载。

如何解决冲突

若要解决此规则的冲突,请调用采用 Uri 参数的重载。

何时禁止显示警告

如果参数不表示 URI,可禁止显示此规则的警告。

抑制警告

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

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

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

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

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

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

可以仅为此规则、为适用的所有规则或为适用的此类别(使用情况)中的所有规则配置此选项。 有关详细信息,请参阅代码质量规则配置选项

包含特定的 API 图面

你可以根据代码库的可访问性,配置要针对其运行此规则的部分。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.api_surface = private, internal

示例

下面的示例演示了与规则冲突的 ErrorProne 方法,以及正确调用 Uri 重载的 SaferWay 方法:

Imports System

Namespace ca2234

    Class History

        Friend Sub AddToHistory(uriString As String)
        End Sub

        Friend Sub AddToHistory(uriType As Uri)
        End Sub

    End Class

    Public Class Browser

        Dim uriHistory As New History()

        Sub ErrorProne()
            uriHistory.AddToHistory("http://www.adventure-works.com")
        End Sub

        Sub SaferWay()
            Try
                Dim newUri As New Uri("http://www.adventure-works.com")
                uriHistory.AddToHistory(newUri)
            Catch uriException As UriFormatException
            End Try
        End Sub

    End Class

End Namespace
class History
{
    internal void AddToHistory(string uriString) { }
    internal void AddToHistory(Uri uriType) { }
}

public class Browser
{
    History uriHistory = new History();

    public void ErrorProne()
    {
        uriHistory.AddToHistory("http://www.adventure-works.com");
    }

    public void SaferWay()
    {
        try
        {
            Uri newUri = new Uri("http://www.adventure-works.com");
            uriHistory.AddToHistory(newUri);
        }
        catch (UriFormatException) { }
    }
}