Share via


CA1819: Eigenschappen mogen geen matrices retourneren

Eigenschappen Weergegeven als
Regel-id CA1819
Titel Eigenschappen mogen geen matrices retourneren
Categorie Prestaties
Oplossing is brekend of niet-brekend Breken
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een eigenschap retourneert een matrix.

Deze regel kijkt standaard alleen naar extern zichtbare eigenschappen en typen, maar dit kan worden geconfigureerd.

Beschrijving van regel

Matrices die door eigenschappen worden geretourneerd, zijn niet beveiligd tegen schrijven, zelfs niet als de eigenschap het kenmerk Alleen-lezen heeft. Als u de matrix manipulatiebestendig wilt houden, moet de eigenschap een kopie van de matrix retourneren. Normaal gesproken begrijpen gebruikers de negatieve gevolgen van het aanroepen van een dergelijke eigenschap niet. Ze kunnen de eigenschap gebruiken als een geïndexeerde eigenschap.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, maakt u de eigenschap een methode of wijzigt u de eigenschap om een verzameling te retourneren.

Wanneer waarschuwingen onderdrukken

U kunt een waarschuwing onderdrukken die wordt gegenereerd voor een eigenschap van een kenmerk dat is afgeleid van de Attribute klasse. Kenmerken kunnen eigenschappen bevatten die matrices retourneren, maar kunnen geen eigenschappen bevatten die verzamelingen retourneren.

U kunt de waarschuwing onderdrukken als de eigenschap deel uitmaakt van een DTO-klasse (Data Transfer Object).

Anders onderdrukt u geen waarschuwing van deze regel.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA1819
// The code that's violating the rule is on this line.
#pragma warning restore CA1819

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA1819.severity = none

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (prestaties) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Specifieke API-oppervlakken opnemen

U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Voorbeeldschending

In het volgende voorbeeld ziet u een eigenschap die deze regel schendt:

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

Als u een schending van deze regel wilt oplossen, maakt u de eigenschap een methode of wijzigt u de eigenschap om een verzameling te retourneren in plaats van een matrix.

De eigenschap wijzigen in een methode

In het volgende voorbeeld wordt de schending opgelost door de eigenschap te wijzigen in een methode:

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

De eigenschap wijzigen om een verzameling te retourneren

In het volgende voorbeeld wordt de schending opgelost door de eigenschap te wijzigen om een 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

Gebruikers toestaan een eigenschap te wijzigen

Mogelijk wilt u de consument van de klasse toestaan een eigenschap te wijzigen. In het volgende voorbeeld ziet u een lees-/schrijfeigenschap die in strijd is met deze regel:

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

In het volgende voorbeeld wordt de schending opgelost door de eigenschap te wijzigen om een 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; }
    }
}