다음을 통해 공유


CA1819: 속성은 배열을 반환해서는 안 됩니다.

속성
규칙 ID CA1819
타이틀 속성은 배열을 반환해서는 안 됩니다.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경
.NET 8에서 기본적으로 사용 아니요

원인

속성이 배열을 반환합니다.

기본적으로 이 규칙은 외부에 표시되는 속성과 형식만 확인하지만 이는 구성 가능합니다.

규칙 설명

속성에서 반환된 배열은 속성이 읽기 전용인 경우에도 쓰기 금지되지 않습니다. 배열을 무단으로 변경하지 못하도록 하려면 속성에서 배열의 복사본을 반환해야 합니다. 일반적으로 사용자는 이러한 속성의 호출로 인해 발생하는 성능 저하를 이해하지 못합니다. 특히 사용자는 속성을 인덱싱된 속성으로 사용할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 속성을 메서드로 설정하거나 컬렉션을 반환하도록 속성을 변경합니다.

경고를 표시하지 않는 경우

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 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

위반 예

다음 예제에서는 이 규칙을 위반하는 속성을 보여 줍니다.

public class Book
{
    private string[] _Pages;

    public Book(string[] pages)
    {
        _Pages = pages;
    }

    public string[] Pages
    {
        get { return _Pages; }
    }
}
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
{
    private ReadOnlyCollection<string> _Pages;
    public Book(string[] pages)
    {
        _Pages = new ReadOnlyCollection<string>(pages);
    }

    public ReadOnlyCollection<string> Pages
    {
        get { return _Pages; }
    }
}
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
{
    private string[] _Pages;

    public Book(string[] pages)
    {
        _Pages = pages;
    }

    public string[] Pages
    {
        get { return _Pages; }
        set { _Pages = value; }
    }
}
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
{
    private Collection<string> _Pages;

    public Book(string[] pages)
    {
        _Pages = new Collection<string>(pages);
    }

    public Collection<string> Pages
    {
        get { return _Pages; }
    }
}