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