CA1819: Właściwości nie powinny zwracać tablic
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Kategoria |
Microsoft.Performance |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Właściwości publiczne lub chronione w typach publicznych zwracają tablicę.
Opis reguły
Tablice zwrócone przez właściwości nie są chronione przed zapisem nawet jeśli właściwość jest tylko do odczytu.Aby zachować tablicę odporną na manipulacje właściwość musi zwracać kopię tablicy.Zazwyczaj użytkownicy nie rozumieją niekorzystnych następstw wydajnościowych wywołania takiej właściwości.W szczególności mogą chcieć z niej korzystać jako z właściwości indeksowanej.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady należy zmienić właściwość w metodę lub sprawić, aby zwracała kolekcję.
Kiedy pominąć ostrzeżenia
Atrybuty mogą zawierać właściwości zwracające tablice, ale nie mogą zawierać właściwości zwracających kolekcje.Można pominąć ostrzeżenie wywoływane dla właściwości atrybutu, który pochodzi od [System.Attribute] klasy.W przeciwnym razie nie pomijaj ostrzeżeń dla tej reguły.
Przykład naruszenia
Opis
W poniższym przykładzie przedstawiono właściwość, która narusza tę regułę.
Kod
Imports System
Namespace PerformanceLibrary
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public ReadOnly Property Pages() As String()
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
namespace PerformanceLibrary
{
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
}
}
}
Komentarze
Aby naprawić naruszenie tej reguły należy zmienić właściwość w metodę lub sprawić, by zwracała kolekcję zamiast tablicy.
Przykład zmiany właściwości w metodę
Opis
Poniższy przykład naprawia naruszenie poprzez zmianę właściwość w metodę.
Kod
Imports System
Namespace PerformanceLibrary
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
End Namespace
using System;
namespace PerformanceLibrary
{
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();
}
}
}
Przykład zwracania kolekcji
Opis
Poniższy przykład naprawia naruszenie przez zmianę sprawiającą, że właściwość zwraca
ReadOnlyCollection.
Kod
Imports System
Imports System.Collections.ObjectModel
Namespace PerformanceLibrary
Public Class Book
Private _Pages As ReadOnlyCollection(Of String)
Public Sub New(ByVal pages As String())
_Pages = New ReadOnlyCollection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As ReadOnlyCollection(Of String)
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace PerformanceLibrary
{
public class Book
{
private ReadOnlyCollection<string> _Pages;
public Book(string[] pages)
{
_Pages = new ReadOnlyCollection<string>(pages);
}
public ReadOnlyCollection<string> Pages
{
get { return _Pages; }
}
}
}
Zezwolenie użytkownikom na modyfikowanie właściwości
Opis
Można umożliwić konsumentowi modyfikowanie właściwości klasy.W poniższym przykładzie przedstawiono właściwość odczytu i zapisu, która narusza regułę.
Kod
Imports System
Namespace PerformanceLibrary
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public Property Pages() As String()
Get
Return _Pages
End Get
Set(ByVal value as String())
_Pages = value
End Set
End Property
End Class
End Namespace
using System;
namespace PerformanceLibrary
{
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
set { _Pages = value; }
}
}
}
Komentarze
Poniższy przykład naprawia naruszenie przez zmianę sprawiającą, że właściwość zwraca Collection.
Kod
Imports System
Imports System.Collections.ObjectModel
Namespace PerformanceLibrary
Public Class Book
Private _Pages As Collection(Of String)
Public Sub New(ByVal pages As String())
_Pages = New Collection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As Collection(Of String)
Get
Return _Pages
End Get
End Property
End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace PerformanceLibrary
{
public class Book
{
private Collection<string> _Pages;
public Book(string[] pages)
{
_Pages = new Collection<string>(pages);
}
public Collection<string> Pages
{
get { return _Pages; }
}
}
}
Powiązane reguły
CA1024: Używaj właściwości wszędzie, gdzie jest to odpowiednie