CA2234:必須傳遞 System.Uri 物件而非字串

屬性
規則識別碼 CA2234
標題 必須傳遞 System.Uri 物件而非字串
類別 使用方式
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

對名稱包含 「uri」、“Uri”、“urn”、“Urn”、“url” 或 “Url” 的方法進行呼叫,而方法的宣告類型包含具有 System.Uri 參數的對應方法多載。

根據預設,此規則只會查看外部可見的方法和類型,但這是可設定

檔案描述

參數名稱會根據駱駝峰大小寫慣例分割成令牌,然後檢查每個令牌是否等於 “uri”、“Uri”、“urn”、“Urn”、“url” 或 “Url”。 如果有相符專案,則會假設 參數代表統一的資源標識元(URI)。 URI 的字串表示方式容易發生剖析和編碼錯誤,並且可能因此產生安全性弱點。 Uri 類別會以安全的方式提供這些服務。 當兩個多載之間只有 URI 表示法不同時,使用者應該選擇採用 Uri 自變數的多載。

如何修正違規

若要修正此規則的違規,請呼叫採用 自變數的多 Uri 載。

隱藏警告的時機

若字串參數不表示 URL,則可放心地隱藏來自此規則的警告。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#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) { }
    }
}