Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1819 |
| Заголовок | Свойства не должны возвращать массивы |
| Категория | Производительность |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Свойство возвращает массив.
По умолчанию это правило проверяет только видимые извне свойства и типы, но это поведение можно настроить.
Описание правила
Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения. Чтобы защитить массив от изменений, свойство должно возвращать копию массива. Как правило, пользователи не понимают негативных последствий для производительности при вызове такого свойства. В частности, они могут использовать свойство в качестве индексированного свойства.
Устранение нарушений
Чтобы исправить нарушение этого правила, либо преобразуйте свойство в метод, либо измените свойство так, чтобы оно возвращало коллекцию.
Когда лучше отключить предупреждения
Предупреждение, возникающее для свойства атрибута, производного от класса Attribute, можно отключить. Атрибуты могут содержать свойства, которые возвращают массивы, но не могут содержать свойства, возвращающие коллекции.
Предупреждение можно отключить, если свойство является частью класса объекта передачи данных (DTO).
В противном случае для этого правила отключать вывод предупреждений не следует.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1819
// The code that's violating the rule is on this line.
#pragma warning restore CA1819
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1819.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (производительности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включите конкретные поверхности API
Вы можете настроить компоненты базы кода для выполнения этого правила на основе их специальных возможностей, задав параметр api_surface. Например, чтобы указать, что правило должно выполняться только для непубличной поверхности API, добавьте следующую пару "ключ-значение" в файл .editorconfig в ваш проект:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Заметка
Замените XXXX частью CAXXXX идентификатором применимого правила.
Пример нарушения
В следующем примере показано свойство, нарушающее это правило:
public class Book
{
public Book(string[] pages)
{
Pages = pages;
}
public string[] Pages { get; }
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = pages
End Sub
Public ReadOnly Property Pages() As String()
End Class
Чтобы устранить нарушение этого правила, либо сделайте свойство методом, либо измените свойство так, чтобы оно возвращало коллекцию, а не массив.
Преобразование свойства в метод
В следующем примере нарушение устраняется путем преобразования свойства в метод:
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
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();
}
}
Изменение свойства для возврата коллекции
В следующем примере нарушение исправляется заменой свойства на возврат System.Collections.ObjectModel.ReadOnlyCollection<T>:
public class Book
{
public Book(string[] pages)
{
Pages = new ReadOnlyCollection<string>(pages);
}
public ReadOnlyCollection<string> Pages { get; }
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = New ReadOnlyCollection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As ReadOnlyCollection(Of String)
End Class
Разрешение пользователям изменять свойство
Может потребоваться разрешить потребителю класса изменять свойство. В следующем примере показано свойство для чтения и записи, нарушающее это правило:
public class Book
{
public Book(string[] pages)
{
Pages = pages;
}
public string[] Pages { get; set; }
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = pages
End Sub
Public Property Pages() As String()
End Class
В следующем примере ошибка устраняется посредством изменения свойства для возврата System.Collections.ObjectModel.Collection<T>:
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = New Collection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As Collection(Of String)
End Class
public class Book
{
public Book(string[] pages)
{
Pages = new Collection<string>(pages);
}
public Collection<string> Pages { get; }
}