CA1819: Eigenschaften sollten keine Arrays zurückgeben
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Breaking |
Ursache
Eine öffentliche oder geschützte Eigenschaft in einem öffentlichen Typ gibt ein Array zurück.
Regelbeschreibung
Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. Normalerweise verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat. Insbesondere könnten sie die Eigenschaft als indizierte Eigenschaft verwenden.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Eigenschaft entweder in eine Methode um oder ändern die Eigenschaft, so dass sie eine Auflistung zurückgibt.
Wann sollten Warnungen unterdrückt werden?
Attribute können Eigenschaften enthalten, die Arrays zurückgeben, aber können keine Eigenschaften enthalten, die Auflistungen zurückgeben. Sie können eine Warnung unterdrücken, die für eine Eigenschaft eines Attributs ausgelöst wird, das von der [System.Attribute]-Klasse abgeleitet wird. Unterdrücken Sie andernfalls keine Warnung dieser Regel.
Beispiel für einen Verstoß
Beschreibungen
Im folgenden Beispiel wird eine Eigenschaft veranschaulicht, die gegen diese Regel verstößt.
Code
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; }
}
}
}
Kommentar
Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Eigenschaft entweder in eine Methode um oder ändern die Eigenschaft, so dass sie anstelle eines Arrays eine Auflistung zurückgibt.
Ändern der Eigenschaft in ein Methodenbeispiel
Beschreibungen
Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft in eine Methode geändert wird.
Code
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();
}
}
}
Zurückgeben eines Auflistungsbeispiels
Beschreibungen
Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft geändert wird, sodass folgender Wert zurückgegeben wird:
ReadOnlyCollection.
Code
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; }
}
}
}
Zulassen der Änderung von Eigenschaften durch Benutzer
Beschreibungen
Sie möchten es dem Consumer der Klasse ermöglichen, eine Eigenschaft zu ändern. Im folgenden Beispiel wird eine Eigenschaft mit Lese-/Schreibzugriff veranschaulicht, die gegen diese Regel verstößt.
Code
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; }
}
}
}
Kommentar
Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft so geändert wird, dass sie Collection zurückgibt.
Code
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; }
}
}
}