CA1819: Propriedades não devem retornar arrays
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Category (Categoria) |
Microsoft.Performance |
A última alteração |
Interromper |
Faz com que
Um público ou propriedade protegida em um tipo público retornam uma matriz.
Descrição da regra
Matrizes retornadas por propriedades não são protegidos contra gravação, 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 compreenderão as implicações de desempenho de adversas chamar uma propriedade.Especificamente, podem usar a propriedade como uma propriedade indexada.
Como corrigir violações
Para corrigir uma violação de esta regra, a propriedade faz um método ou alterar a propriedade para retornar uma coleção.
Quando suprimir avisos
Atributos podem conter propriedades que as matrizes de retorno, mas não podem conter propriedades que retornam coleções.Você pode eliminar um aviso que é gerado para uma propriedade de um atributo que é derivado da classe de [System.Attribute] .Caso contrário, não elimina um aviso de esta regra.
Violação de exemplo
Descrição
O exemplo a seguir mostra uma propriedade que viole 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 de esta regra, a propriedade faz um método ou alterar a propriedade para retornar uma coleção em vez de uma matriz.
Altere a propriedade para um exemplo de método
Descrição
O exemplo corrigir 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 corrigir 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; }
}
}
}
Permitir que usuários modifiquem uma propriedade
Descrição
Você pode querer permitir que o consumidor da classe modificar uma propriedade.O exemplo a seguir mostra uma propriedade de leitura/gravação. esta regra que viole
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 corrigir 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; }
}
}
}