Freigeben über


CA1819: Eigenschaften sollten keine Arrays zurückgeben

TypeName

PropertiesShouldNotReturnArrays

CheckId

CA1819

Kategorie

Microsoft.Performance

Unterbrechende Änderung

Breaking

Ursache

Eine öffentliche oder geschützte Eigenschaft in einem öffentlichen Typ gibt ein Array zurück.

Regelbeschreibung

Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. Normalerweise verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat. Insbesondere könnten sie die Eigenschaft als indizierte Eigenschaft verwenden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Eigenschaft entweder in eine Methode um oder ändern die Eigenschaft, so dass sie eine Auflistung zurückgibt.

Wann sollten Warnungen unterdrückt werden?

Attribute können Eigenschaften enthalten, die Arrays zurückgeben, aber können keine Eigenschaften enthalten, die Auflistungen zurückgeben. Sie können eine Warnung unterdrücken, die für eine Eigenschaft eines Attributs ausgelöst wird, das von der [System.Attribute]-Klasse abgeleitet wird. Unterdrücken Sie andernfalls keine Warnung dieser Regel.

Beispiel für einen Verstoß

Beschreibungen

Im folgenden Beispiel wird eine Eigenschaft veranschaulicht, die gegen diese Regel verstößt.

Code

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

Kommentar

Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Eigenschaft entweder in eine Methode um oder ändern die Eigenschaft, so dass sie anstelle eines Arrays eine Auflistung zurückgibt.

Ändern der Eigenschaft in ein Methodenbeispiel

Beschreibungen

Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft in eine Methode geändert wird.

Code

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

Zurückgeben eines Auflistungsbeispiels

Beschreibungen

Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft geändert wird, sodass folgender Wert zurückgegeben wird:

ReadOnlyCollection.

Code

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

Zulassen der Änderung von Eigenschaften durch Benutzer

Beschreibungen

Sie möchten es dem Consumer der Klasse ermöglichen, eine Eigenschaft zu ändern. Im folgenden Beispiel wird eine Eigenschaft mit Lese-/Schreibzugriff veranschaulicht, die gegen diese Regel verstößt.

Code

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

Kommentar

Im folgenden Beispiel wird der Verstoß korrigiert, indem die Eigenschaft so geändert wird, dass sie Collection zurückgibt.

Code

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

Verwandte Regeln

CA1024: Nach Möglichkeit Eigenschaften verwenden