Eigenschaften sollten keine Arrays zurückgeben
TypeName |
PropertiesShouldNotReturnArrays |
CheckId |
CA1819 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Breaking |
Ursache
Eine öffentliche oder geschützte Eigenschaft in einem öffentlichen Typ gibt ein Array zurück.
Regelbeschreibung
Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. I. d. R. verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat. Insbesondere könnten sie die Eigenschaft als indizierte Eigenschaft verwenden.
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, wandeln Sie die Eigenschaft in eine Methode um.
Warnungsausschluss
Schließen Sie keine Warnung dieser Regel aus.
Beispiel
Im folgenden Beispiel wird eine Eigenschaft veranschaulicht, die gegen diese Regel verstößt. Die Main
-Methode verdeutlicht, dass Code bei Verwendung einer solchen Eigenschaft eventuell eine schlechte Leistung bietet.
Imports System
Namespace PerformanceLibrary
Public Class Test
Private nameValues() As String
Public Sub New()
nameValues = New String(100) {}
' Loading string array with sample data.
Dim i As Integer
For i = 0 To 99
nameValues(i) = "Sample"
Next i
End Sub 'New
' Violates rule: PropertiesShouldNotReturnArrays.
Public ReadOnly Property Names() As String()
Get
Return CType(nameValues.Clone(), String())
End Get
End Property
Public Shared Sub Main()
' Using the property in the following manner
' results in 201 copies of the array.
' One copy is made each time the loop executes,
' and one copy is made each time the condition is tested.
Dim t As New Test()
Dim i As Integer
For i = 0 To t.Names.Length - 1
If t.Names(i) = "SomeName" Then
' Perform some operation.
End If
Next i
End Sub 'Main
End Class 'Test
End Namespace
using System;
namespace PerformanceLibrary
{
public class Test
{
string [] nameValues;
public Test()
{
nameValues = new string[100];
// Loading string array with sample data.
for (int i = 0; i< 100; i++)
{
nameValues[i] = "Sample";
}
}
// Violates rule: PropertiesShouldNotReturnArrays.
public string [] Names
{
get
{
return (string[]) nameValues.Clone();
}
}
public static void Main()
{
// Using the property in the following manner
// results in 201 copies of the array.
// One copy is made each time the loop executes,
// and one copy is made each time the condition is tested.
Test t = new Test();
for (int i = 0; i < t.Names.Length ; i++)
{
if (t.Names[i] == ("SomeName"))
{
// Perform some operation.
}
}
}
}
}