CA1819: Properti tidak boleh mengembalikan larik

Properti Nilai
ID Aturan CA1819
Judul Properti tidak boleh mengembalikan sebuah array
Kategori Performa
Perbaikan bersifat merusak atau tidak merusak Merusak
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Properti mengembalikan sebuah 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 terlindung dari penulisan, meskipun properti tersebut bersifat hanya baca. Untuk menjaga agar larik tahan dirusak, properti harus mengembalikan salinan larik. Biasanya, pengguna tidak akan memahami dampak negatif terhadap performa dari penggunaan 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 muncul untuk properti atribut yang berasal dari kelas Attribute. 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 basis kode mana yang akan dijalankan aturan ini, berdasarkan aksesibilitasnya, dengan mengatur opsi api_surface. 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

Nota

Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.

Contoh pelanggaran

Contoh berikut menunjukkan properti yang melanggar aturan ini:

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

Untuk memperbaiki pelanggaran aturan ini, ubah properti menjadi metode atau ubah properti untuk mengembalikan kumpulan alih-alih array.

Mengubah properti menjadi metode

Contoh berikut memperbaiki pelanggaran dengan mengubah properti menjadi sebuah 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();
    }
}

Ubah properti untuk mengembalikan koleksi

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

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

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

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
{
    public Book(string[] pages)
    {
        Pages = new Collection<string>(pages);
    }

    public Collection<string> Pages { get; }
}