CA1819: Dizi döndüren özellikler kullanılmamalıdır.

Özellik Değer
Kural Kimliği CA1819
Başlık Özellikler diziler döndürmemelidir
Kategori Performans
Düzeltme bozucu ya da bozmayan olabilir Son Dakika
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Bir özellik bir dizi döndürür.

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

Kural açıklaması

Özellikler tarafından döndürülen diziler, özellik salt okunur olsa bile yazma korumalı değildir. Diziyi yetkisiz erişime karşı korumalı tutmak için, özellik dizinin bir kopyasını döndürmelidir. Genellikle, kullanıcılar böyle bir özelliği çağırmanın olumsuz performans etkilerini anlamayacaktır. Bir özelliği özellikle dizinli özellik olarak kullanabilirler.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için özelliğini bir yöntem yapın veya özelliğini bir koleksiyon döndürecek şekilde değiştirin.

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

sınıfından türetilen bir özelliğin özniteliği için tetiklenen bir uyarıyı gizleyebilirsiniz. Öznitelikler dizi döndüren özellikler içerebilir, ancak koleksiyon döndüren özellikler içeremez.

Özellik bir Veri Aktarım Nesnesi (DTO) sınıfının parçasıysa uyarıyı gizleyebilirsiniz.

Aksi takdirde, bu kurala ait bir uyarıyı gizlemeyin.

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 CA1819
// The code that's violating the rule is on this line.
#pragma warning restore CA1819

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

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

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

Kod çözümleme için konfigüre et

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 için, geçerli olduğu tüm kurallar için veya bu kategorideki (Performans) 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

api_surface seçeneğini ayarlayarak, bu kuralın erişilebilirliği temelinde kod tabanınızın hangi bölümlerinde çalıştırılacaklarını 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

Not

XXXX CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.

Örnek ihlal

Aşağıdaki örnekte bu kuralı ihlal eden bir özellik gösterilmektedir:

public class Book
{
    public Book(string[] pages)
    {
        Pages = pages;
    }

    public string[] Pages { get; }
}
Public Class Book
    Public Sub New(ByVal pages As String())
        Me.Pages = pages
    End Sub

    Public ReadOnly Property Pages() As String()
End Class

Bu kuralın ihlalini düzeltmek için özelliğini bir yöntem yapın veya özelliğini dizi yerine koleksiyon döndürecek şekilde değiştirin.

özelliğini bir yöntemle değiştirme

Aşağıdaki örnek, özelliğini bir yönteme değiştirerek ihlali düzeltir:

Public Class Book

    Private _Pages As String()

    Public Sub New(ByVal pages As String())
        _Pages = pages
    End Sub

    Public Function GetPages() As String()
        ' Need to return a clone of the array so that consumers            
        ' of this library cannot change its contents            
        Return DirectCast(_Pages.Clone(), String())
    End Function

End Class
public class Book
{
    private string[] _Pages;

    public Book(string[] pages)
    {
        _Pages = pages;
    }

    public string[] GetPages()
    {
        // Need to return a clone of the array so that consumers            
        // of this library cannot change its contents            
        return (string[])_Pages.Clone();
    }
}

Bir koleksiyon döndürmek için özelliğini değiştirme

Aşağıdaki örnek, özelliği bir System.Collections.ObjectModel.ReadOnlyCollection<T> döndürecek şekilde değiştirerek hatayı düzeltir.

public class Book
{
    public Book(string[] pages)
    {
        Pages = new ReadOnlyCollection<string>(pages);
    }

    public ReadOnlyCollection<string> Pages { get; }
}
Public Class Book
    Public Sub New(ByVal pages As String())
        Me.Pages = New ReadOnlyCollection(Of String)(pages)
    End Sub

    Public ReadOnly Property Pages() As ReadOnlyCollection(Of String)

End Class

Kullanıcıların bir özelliği değiştirmesine izin verme

Sınıfın tüketicisinin bir özelliği değiştirmesine izin vermek isteyebilirsiniz. Aşağıdaki örnekte bu kuralı ihlal eden bir okuma/yazma özelliği gösterilmektedir:

public class Book
{
    public Book(string[] pages)
    {
        Pages = pages;
    }

    public string[] Pages { get; set; }
}
Public Class Book
    Public Sub New(ByVal pages As String())
        Me.Pages = pages
    End Sub

    Public Property Pages() As String()

End Class

Aşağıdaki örnek, özelliği bir System.Collections.ObjectModel.Collection<T> döndürecek şekilde değiştirerek ihlali düzeltir.

Public Class Book
    Public Sub New(ByVal pages As String())
        Me.Pages = New Collection(Of String)(pages)
    End Sub

    Public ReadOnly Property Pages() As Collection(Of String)
End Class
public class Book
{
    public Book(string[] pages)
    {
        Pages = new Collection<string>(pages);
    }

    public Collection<string> Pages { get; }
}