共用方式為


CA1819:屬性不應傳回陣列

型別名稱

PropertiesShouldNotReturnArrays

CheckId

CA1819

分類

Microsoft.Performance

中斷變更

中斷

原因

公用型別中之公用或保護的屬性會傳回陣列。

規則描述

即使屬性是唯讀,所傳回的陣列不會是寫入保護。若要保持陣列為防止遭他人修改,屬性必須傳回陣列複本。一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。使用者更有可能使用屬性做為索引屬性。

如何修正違規

若要修正這個規則的違規情形,請讓屬性成為方法,或是變更屬性以傳回集合。

隱藏警告的時機

屬性 (Attribute) 可以包含傳回陣列的屬性 (Property),但不能包含傳回集合的屬性 (Property)。您可以隱藏針對衍生自 [System.Attribute] 類別之屬性 (Attribute) 的屬性 (Property) 所引發的警告。否則,不要隱藏此規則的警告。

範例違規

描述

下列範例顯示違反此規則的屬性。

程式碼

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

註解

若要修正這個規則的違規情形,請讓屬性成為方法,或是變更屬性以傳回集合而非陣列。

變更屬性為方法的範例

描述

下列範例會藉由變更屬性為方法來修正違規。

程式碼

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

傳回集合的範例

描述

下列範例會藉由變更屬性以傳回集合來修正違規。

ReadOnlyCollection.

程式碼

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

允許使用者修改屬性

描述

您可能會想要允許類別消費者修改屬性。下列範例顯示違反這個規則的讀取/寫入屬性。

程式碼

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

註解

下列範例會藉由變更屬性以傳回 Collection 來修正違規。

程式碼

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

相關規則

CA1024:建議在適當時使用屬性