CA1819: Vlastnosti by neměly vracet pole
Název_typu |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Kategorie |
Microsoft.Performance |
Změnit rozdělení |
Rozdělení |
Příčina
Veřejné nebo chráněná vlastnost veřejné typu vrátí pole.
Popis pravidla
Vrácený vlastností polí nejsou chráněna proti zápisu, i když je vlastnost pouze pro čtení.Aby osvědčenou pole vlastnost musí vrátit kopii pole.Uživatelé obvykle nebude porozumět výkonu nepříznivé důsledky volání těchto vlastností.Konkrétně mohou využít vlastnost jako indexovaná vlastnost.
Jak vyřešit narušení
Opravit porušení tohoto pravidla, byla vlastnost metoda nebo vlastnost vrátit kolekci změnit.
Při potlačení upozornění
Atributy mohou obsahovat vlastnosti, které vrátí matice, ale nemohou obsahovat vlastnosti, které vracejí kolekcí.Můžete potlačit varování, že je aktivována pro vlastnost atribut, který je odvozen z [System.Attribute] třídy.Jinak Nepotlačovat upozornění od tohoto pravidla.
Příklad narušení
Description
Následující příklad ukazuje vlastnost, která toto pravidlo porušují.
Kód
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; }
}
}
}
Komentáře
Porušení tohoto pravidla stanovit, byla vlastnost metoda nebo vlastnost vrátit kolekci místo pole změnit.
Změňte vlastnost příkladu metoda
Description
Následující příklad řeší porušení změnou vlastnosti metody.
Kód
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();
}
}
}
Vrátí kolekci příklad
Description
Následující příklad řeší porušení změnou vlastnosti vrátit
ReadOnlyCollection.
Kód
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; }
}
}
}
Umožnit uživatelům změnit vlastnost
Description
Můžete umožnit spotřebiteli třídy upravit vlastnost.V následujícím příkladu je vlastnost pro čtení i zápis, která poruší toto pravidlo.
Kód
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; }
}
}
}
Komentáře
Následující příklad řeší porušení změnou vlastnosti vrátit Collection.
Kód
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; }
}
}
}