CA1819: Las propiedades no deberían devolver matrices
Nombre de tipo |
PropertiesShouldNotReturnArrays |
Identificador de comprobación |
CA1819 |
Categoría |
Microsoft.Performance |
Cambio problemático |
Sí |
Causa
Una propiedad pública o protegida en un tipo público devuelve una matriz.
Descripción de la regla
Las matrices devueltas por las propiedades no están protegidas contra escritura, aun cuando la propiedad es de sólo lectura. Para mantener la matriz inviolable, la propiedad debe devolver una copia de la matriz. Por lo general, los usuarios no entienden las implicaciones de rendimiento adversas que se originan al llamar a este tipo de propiedad. Específicamente, podrían utilizar la propiedad como una propiedad indizada.
Cómo corregir infracciones
Para corregir una infracción de esta regla, convierta la propiedad en un método o cambie la propiedad para que devuelva una colección.
Cuándo suprimir advertencias
Los atributos pueden contener propiedades que devuelven matrices, pero no pueden contener propiedades que devuelven colecciones. Puede suprimir una advertencia provocada por una propiedad de un atributo que se deriva de la clase [System.Attribute]. En caso contrario, no suprima ninguna advertencia de esta regla.
Infracción de ejemplo
Descripción
El siguiente ejemplo muestra una propiedad que infringe esta regla.
Código
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; }
}
}
}
Comentarios
Para corregir una infracción de esta regla, convierta la propiedad en un método o cambie la propiedad para que devuelva una colección en lugar de una matriz.
Cambiar la propiedad a un ejemplo del método
Descripción
En el ejemplo siguiente se corrige la infracción cambiando la propiedad a un método.
Código
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();
}
}
}
Devolver un ejemplo de colección
Descripción
En el ejemplo siguiente se corrige la infracción cambiando la propiedad para que devuelva
ReadOnlyCollection.
Código
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; }
}
}
}
Permitir a los usuarios modificar una propiedad
Descripción
Es posible que desee permitir al consumidor de la clase modificar una propiedad. En el siguiente ejemplo se muestra una propiedad de lectura/escritura que infringe esta regla.
Código
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; }
}
}
}
Comentarios
En el ejemplo siguiente se corrige la infracción cambiando la propiedad para que devuelva Collection.
Código
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; }
}
}
}