Поделиться через


CA1819: свойства не должны возвращать массивы

TypeName

PropertiesShouldNotReturnArrays

CheckId

CA1819

Категория

Microsoft.Performance

Критическое изменение

Критическое изменение

Причина

Открытое или защищенное свойство в открытом типе возвращает массив.

Описание правила

Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения.Чтобы защитить массив от изменений, свойство должно возвращать копию массива.Как правило, пользователи не понимают требований к производительности при вызове такого свойства.В частности, они могут использовать это свойство как индексированное.

Устранение нарушений

Чтобы устранить нарушение этого правила, либо сделайте свойство методом, либо измените свойство, чтобы оно возвращало коллекцию.

Отключение предупреждений

Атрибуты могут содержать свойства, возвращающие массивы, но не могут содержать свойства, которые возвращают коллекции.Можно отключить предупреждение, вызываемое для свойства атрибута, производного от класса [System.Attribute].В противном случае для этого правила отключать вывод предупреждений не следует.

Пример нарушения

Описание

В следующем примере показано свойство, нарушающее это правило.

Код

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: используйте свойства, если это уместно