Partilhar via


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; }        
        }    
    }
}

Regras Relacionadas

CA1024: usar propriedades quando apropriado