Aracılığıyla paylaş


CA2234: Dizeler yerine System.Uri nesneleri gönderin

Özellik Değer
Kural Kimliği CA2234
Başlık Dizeler yerine System.Uri nesneleri gönderin
Kategori Kullanım
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Hayır

Neden

Adı "uri", "Uri", "urn", "Urn", "url" veya "Url" içeren bir dize parametresine sahip bir yönteme çağrı yapılır ve yöntemin bildirim türü parametresi olan System.Uri ilgili bir yöntem aşırı yüklemesini içerir.

Varsayılan olarak, bu kural yalnızca dışarıdan görünen yöntemlere ve türlere bakar, ancak bu yapılandırılabilir.

Kural açıklaması

Parametre adı, deve büyük/küçük harf kuralına göre belirteçlere bölünür ve ardından her belirtecin "uri", "Uri", "urn", "Urn", "url" veya "Url" değerine eşit olup olmadığını görmek için denetlenir. Eşleşme varsa, parametresinin tekdüzen kaynak tanımlayıcısını (URI) temsil ediyor olduğu varsayılır. Bir URI'nın dize sunumu ayrıştırma ve hataları kodlama eğilimindedir ve güvenlik açıklarına yol açabilir. Uri sınıfı bu hizmetleri güvenli ve güvenli bir şekilde sağlar. İki aşırı yükleme arasında yalnızca URI'nin gösterimiyle ilgili olarak farklı bir seçim olduğunda, kullanıcı bağımsız Uri değişken alan aşırı yüklemeyi seçmelidir.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için bağımsız değişkeni alan aşırı yüklemeyi çağırın Uri .

Uyarıların ne zaman bastırılması gerekiyor?

Dize parametresi bir URI'yi temsil etmiyorsa, bu kuraldan gelen bir uyarıyı engellemek güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none olarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Çözümlemek için kod yapılandırma

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.

Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Kullanım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Belirli API yüzeylerini ekleme

Bu kuralın üzerinde çalıştırılacak kod tabanınızın hangi bölümlerini erişilebilirliklerine göre yapılandırabilirsiniz. Örneğin, kuralın yalnızca genel olmayan API yüzeyinde çalıştırılması gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Örnek

Aşağıdaki örnekte, ErrorPronekuralı ihlal eden bir yöntemi ve aşırı yüklemeyi doğru şekilde çağıran bir yöntem SaferWaygösterilmektedir Uri :

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