Sdílet prostřednictvím


Eigenschaften sollten keine Arrays zurückgeben

Aktualisiert: November 2007

     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.

Behandlung 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?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel für einen Verstoß

Beschreibung

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

Kommentare

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

Beschreibung

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

Beschreibung

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

Beschreibung

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

Kommentare

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

Nach Möglichkeit Eigenschaften verwenden