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 9 | No |
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 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 XXXX
CAXXXX
dengan ID aturan yang berlaku.
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; }
}
}