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 9'da 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 none
olarak 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
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
{
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; }
}
}