Share via


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.
                }
            } 
        
        }
    }
}

Verwandte Regeln

Nach Möglichkeit Eigenschaften verwenden