CA2234:文字列の代わりに System.Uri オブジェクトを渡します

プロパティ
ルール ID CA2234
Title 文字列の代わりに System.Uri オブジェクトを渡します
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

名前に "uri"、"Uri"、"urn"、"Urn"、"url"、または "Url" が含まれている文字列パラメーターが指定されたメソッドが呼び出されます。そのメソッドの宣言する型には、System.Uri パラメーターが指定されている対応するメソッド オーバーロードが含まれています。

既定では、この規則の対象は外部から参照可能なメソッドと型のみですが、これは構成可能です。

規則の説明

パラメーター名はキャメル ケース規則に基づいてトークンに分割され、各トークンは "uri"、"Uri"、"urn"、"Urn"、"url"、または "Url" に一致するかどうかが確認されます。 一致するものがあれば、そのパラメーターは Uniform Resource Identifier (URI) を表していると見なされます。 URI の文字列表現は解析エラーやエンコーディング エラーが発生しやすく、セキュリティ上の脆弱性の原因となる場合があります。 Uri クラスを使用すると、安全な方法でこのサービスを実現できます。 URI の表現のみが異なる 2 つのオーバーロードのいずれかを選択する場合、ユーザーは 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) { }
    }
}