Udostępnij za pośrednictwem


CA1819: Właściwości nie powinny zwracać tablic

TypeName

PropertiesShouldNotReturnArrays

CheckId

CA1819

Kategoria

Microsoft.Performance

Zmiana kluczowa

Kluczowa

Przyczyna

Właściwości publiczne lub chronione w typach publicznych zwracają tablicę.

Opis reguły

Tablice zwrócone przez właściwości nie są chronione przed zapisem nawet jeśli właściwość jest tylko do odczytu.Aby zachować tablicę odporną na manipulacje właściwość musi zwracać kopię tablicy.Zazwyczaj użytkownicy nie rozumieją niekorzystnych następstw wydajnościowych wywołania takiej właściwości.W szczególności mogą chcieć z niej korzystać jako z właściwości indeksowanej.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady należy zmienić właściwość w metodę lub sprawić, aby zwracała kolekcję.

Kiedy pominąć ostrzeżenia

Atrybuty mogą zawierać właściwości zwracające tablice, ale nie mogą zawierać właściwości zwracających kolekcje.Można pominąć ostrzeżenie wywoływane dla właściwości atrybutu, który pochodzi od [System.Attribute] klasy.W przeciwnym razie nie pomijaj ostrzeżeń dla tej reguły.

Przykład naruszenia

Opis

W poniższym przykładzie przedstawiono właściwość, która narusza tę regułę.

Kod

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

Komentarze

Aby naprawić naruszenie tej reguły należy zmienić właściwość w metodę lub sprawić, by zwracała kolekcję zamiast tablicy.

Przykład zmiany właściwości w metodę

Opis

Poniższy przykład naprawia naruszenie poprzez zmianę właściwość w metodę.

Kod

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

Przykład zwracania kolekcji

Opis

Poniższy przykład naprawia naruszenie przez zmianę sprawiającą, że właściwość zwraca

ReadOnlyCollection.

Kod

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

Zezwolenie użytkownikom na modyfikowanie właściwości

Opis

Można umożliwić konsumentowi modyfikowanie właściwości klasy.W poniższym przykładzie przedstawiono właściwość odczytu i zapisu, która narusza regułę.

Kod

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

Komentarze

Poniższy przykład naprawia naruszenie przez zmianę sprawiającą, że właściwość zwraca Collection.

Kod

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

Powiązane reguły

CA1024: Używaj właściwości wszędzie, gdzie jest to odpowiednie