Compartir a través de


Las propiedades no deberían devolver matrices

Actualización: noviembre 2007

Nombre de tipo

PropertiesShouldNotReturnArrays

Identificador de comprobación

CA1819

Categoría

Microsoft.Performance

Cambio problemático

Motivo

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

No suprima las advertencias de esta regla.

Infracción del 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; }        
        }    
    }
}

Reglas relacionadas

Utilizar las propiedades donde corresponda