CA1819: as propriedades não devem retornar matrizes
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Categoria |
Microsoft.Performance |
Alteração Significativa |
Quebra |
Causa
Um público ou uma propriedade seguras em um tipo público retornam uma matriz.
Descrição da Regra
As matrizes retornadas por propriedades para gravação não são protegidas, mesmo se a propriedade é somente leitura.Para manter a matriz inalterável, a propriedade deve retornar uma cópia da matriz.Normalmente, os usuários não adversas integrarem as implicações de desempenho de chamar essas propriedades.Especificamente, poderá usar a propriedade como uma propriedade indexada.
Como Corrigir Violações
Para corrigir uma violação desta regra, faz à propriedade um método ou alterar a propriedade para retornar uma coleção.
Quando Suprimir Alertas
Os atributos podem conter as propriedades que as matrizes de retorno, mas não podem conter as propriedades que as coleções de retorno.Você pode suprimir um aviso que é gerado para uma propriedade de um atributo que é derivado da classe de [System.Attribute] .Caso contrário, não suprima um aviso desta regra.
Violação de exemplo
Descrição
O exemplo a seguir mostra uma propriedade que viola esta regra.
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; }
}
}
}
Comentários
Para corrigir uma violação desta regra, faz à propriedade um método ou alterar a propriedade para retornar uma coleção em vez de uma matriz.
Altere a propriedade para um método de exemplo
Descrição
O exemplo a seguir corrige a violação alterando a propriedade para um 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();
}
}
}
Retornar um exemplo de coleção
Descrição
O exemplo a seguir corrige a violação alterando a propriedade para retornar a
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; }
}
}
}
Permitindo que os usuários possam modificar uma propriedade
Descrição
Talvez você queira permitir que o consumidor da classe modificar uma propriedade.O exemplo a seguir mostra uma propriedade de leitura/gravação que viola esta regra.
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; }
}
}
}
Comentários
O exemplo a seguir corrige a violação alterando a propriedade para retornar 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; }
}
}
}