CA1819: Özellikler diziler döndürmemelidir

Özellik Değer
Kural Kimliği CA1819
Başlık Özellikler diziler döndürmemelidir
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Yeni
.NET 8'de varsayılan olarak etkin Hayır

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. Dizi değiştirilmeye kanıt tutulacak özellik dizisinin bir kopyasını döndürmelidir. Genellikle, kullanıcılar böyle bir özelliği çağırmanın olumsuz performans etkilerini anlamayacaktır. Özellikle, özelliği dizinli özellik olarak kullanabilir.

İ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 özniteliğin özelliği için tetiklenen bir uyarıyı Attribute 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 kuraldan 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.

Çö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 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

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 ihlal

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

public class Book
{
    private string[] _Pages;

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

    public string[] Pages
    {
        get { return _Pages; }
    }
}
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ğini döndürecek System.Collections.ObjectModel.ReadOnlyCollection<T>şekilde değiştirerek ihlali düzeltir:

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

    public ReadOnlyCollection<string> Pages
    {
        get { return _Pages; }
    }
}
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
{
    private string[] _Pages;

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

    public string[] Pages
    {
        get { return _Pages; }
        set { _Pages = value; }
    }
}
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ğini döndürecek System.Collections.ObjectModel.Collection<T>ş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
{
    private Collection<string> _Pages;

    public Book(string[] pages)
    {
        _Pages = new Collection<string>(pages);
    }

    public Collection<string> Pages
    {
        get { return _Pages; }
    }
}