CA1819 : Les propriétés ne doivent pas retourner des tableaux
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Catégorie |
Microsoft.Performance |
Modification avec rupture |
Oui |
Cause
Une propriété publique ou protégée dans un type public retourne un tableau.
Description de la règle
Les tableaux retournés par les propriétés ne sont pas protégés en écriture, même si la propriété est en lecture seule.Pour protéger le tableau de toute falsification, la propriété doit retourner une copie du tableau.En général, les utilisateurs ne comprennent l'incidence négative en matière de performances de l'appel à une telle propriété.Spécifiquement, ils peuvent utiliser la propriété en tant que propriété indexée.
Comment corriger les violations
Pour corriger une violation de cette règle, modifiez la propriété en une méthode ou modifiez-la de sorte qu'elle retourne une collection.
Quand supprimer les avertissements
Les attributs peuvent contenir des propriétés qui retournent des tableaux, mais ne peuvent pas contenir des propriétés qui retournent des collections.Vous pouvez supprimer un avertissement déclenché pour une propriété d'un attribut qui est dérivé de la classe [System.Attribute].Sinon, ne supprimez aucun avertissement de cette règle.
Exemple de violation
Description
L'exemple suivant présente un type qui enfreint cette règle.
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; }
}
}
}
Commentaires
Pour corriger une violation de cette règle, modifiez la propriété en une méthode ou modifiez-la de sorte qu'elle retourne une collection plutôt qu'un tableau.
Modifier la propriété en un exemple de méthode
Description
L'exemple suivant résout la violation en modifiant la propriété en une méthode.
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();
}
}
}
Retourner un exemple de collection
Description
L'exemple suivant résout la violation en modifiant la propriété de sorte qu'elle retourne une
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; }
}
}
}
Autoriser les utilisateurs à modifier une propriété
Description
Vous pouvez permettre au consommateur de la classe de modifier une propriété.L'exemple suivant présente une propriété en lecture/écriture qui enfreint cette règle.
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; }
}
}
}
Commentaires
L'exemple suivant résout la violation en modifiant la propriété de sorte qu'elle retourne une Collection.
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; }
}
}
}