Bagikan melalui


CA1819: Properti tidak boleh mengembalikan larik

Properti Nilai
ID Aturan CA1819
Judul Properti tidak boleh mengembalikan array
Golongan Performa
Perbaikan bersifat disruptif atau non-disruptif Merusak
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Properti mengembalikan array.

Secara default, aturan ini hanya melihat properti dan jenis yang terlihat secara eksternal, tetapi ini dapat dikonfigurasi.

Deskripsi aturan

Array yang dikembalikan oleh properti tidak dilindungi penulisan, meskipun properti bersifat baca-saja. Untuk menjaga agar larik tidak rusak, properti harus mengembalikan salinan larik. Biasanya, pengguna tidak akan memahami implikasi performa yang merugikan dari panggilan properti tersebut. Secara khusus, mereka mungkin menggunakan properti sebagai properti terindeks.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, jadikan properti sebagai metode atau ubah properti untuk mengembalikan koleksi.

Kapan harus menekan peringatan

Anda dapat menekan peringatan yang dimunculkan untuk properti atribut yang berasal dari Attribute kelas . Atribut dapat berisi properti yang mengembalikan array, tetapi tidak dapat berisi properti yang mengembalikan koleksi.

Anda dapat menyembunyikan peringatan jika properti adalah bagian dari kelas Objek Transfer Data (DTO).

Jika tidak, jangan menekan peringatan dari aturan ini.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang berlaku untuknya, atau untuk semua aturan dalam kategori ini (Performa) yang diterapkannya. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Menyertakan permukaan API tertentu

Anda dapat mengonfigurasi bagian mana dari basis kode yang akan menjalankan aturan ini, berdasarkan aksesibilitasnya. Misalnya, untuk menentukan bahwa aturan hanya boleh dijalankan pada permukaan API non-publik, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Contoh pelanggaran

Contoh berikut menunjukkan properti yang melanggar aturan ini:

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

Untuk memperbaiki pelanggaran aturan ini, jadikan properti sebagai metode atau ubah properti untuk mengembalikan koleksi alih-alih array.

Mengubah properti menjadi metode

Contoh berikut memperbaiki pelanggaran dengan mengubah properti menjadi metode:

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();
    }
}

Mengubah properti untuk mengembalikan koleksi

Contoh berikut memperbaiki pelanggaran dengan mengubah properti untuk mengembalikan System.Collections.ObjectModel.ReadOnlyCollection<T>:

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

Perbolehkan pengguna mengubah properti

Anda mungkin ingin mengizinkan konsumen kelas untuk memodifikasi properti. Contoh berikut menunjukkan properti baca/tulis yang melanggar aturan ini:

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

Contoh berikut memperbaiki pelanggaran dengan mengubah properti untuk mengembalikan System.Collections.ObjectModel.Collection<T>:

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; }
    }
}