Richtlinien für die Verwendung von Arrays

Eine allgemeine Beschreibung von Arrays und deren Verwendung finden Sie unter Arrays und System.Array-Klasse.

Arrays oder Auflistungen

Als Entwickler von Klassenbibliotheken müssen Sie oft schwierige Entscheidungen dahin gehend treffen, wann ein Array zu verwenden ist und wann eine Auflistung zurückgegeben werden soll. Diese Typen werden zwar nach einem ähnlichen Schema verwendet, weisen jedoch unterschiedliche Leistungscharakteristika auf. Im Allgemeinen sollten Sie ein Auflistung verwenden, wenn Add, Remove oder andere Methoden für die Bearbeitung der Auflistung unterstützt werden.

Weitere Informationen über die Verwendung von Auflistungen finden Sie unter Auflistungen und Datenstrukturen.

Arrayverwendung

Geben Sie keine interne Instanz eines Arrays zurück. Dadurch kann Code zum Ändern des Arrays aufgerufen werden. Das folgende Beispiel veranschaulicht, wie das Array badChars von Code verändert werden kann, der auf die Path-Eigenschaft zugreift, obwohl die Eigenschaft nicht den Set-Accessor implementiert.

Imports System
Imports System.Collections
Imports Microsoft.VisualBasic

Public Class ExampleClass
   NotInheritable Public Class Path
      Private Sub New()
      End Sub

      Private Shared badChars() As Char = {Chr(34),"<"c,">"c}
      
      Public Shared Function GetInvalidPathChars() As Char()
         Return badChars
      End Function

   End Class
   
   Public Shared Sub Main()
      ' The following code displays the elements of the 
      ' array as expected.
      Dim c As Char
      For Each c In  Path.GetInvalidPathChars()
         Console.Write(c)
      Next c
      Console.WriteLine()
      
      ' The following code sets all the values to A.
      Path.GetInvalidPathChars()(0) = "A"c
      Path.GetInvalidPathChars()(1) = "A"c
      Path.GetInvalidPathChars()(2) = "A"c
      
      ' The following code displays the elements of the array to the
      ' console. Note that the values have changed.
      For Each c In  Path.GetInvalidPathChars()
         Console.Write(c)
      Next c
   End Sub
End Class
using System;
using System.Collections;

public class ExampleClass
{
   public sealed class Path
   {
      private Path(){}
      private static char[] badChars = {'\"', '<', '>'};
      public static char[] GetInvalidPathChars()
      {
         return badChars;
      }
   }
   public static void Main()
   {
      // The following code displays the elements of the 
      // array as expected.
      foreach(char c in Path.GetInvalidPathChars())
      {
         Console.Write(c);
      }
      Console.WriteLine();

      // The following code sets all the values to A.
      Path.GetInvalidPathChars()[0] = 'A';
      Path.GetInvalidPathChars()[1] = 'A';
      Path.GetInvalidPathChars()[2] = 'A';

      // The following code displays the elements of the array to the
      // console. Note that the values have changed.
      foreach(char c in Path.GetInvalidPathChars())
      {
         Console.Write(c);
      }
   }
}

Sie können das Problem im vorangegangenen Beispiel nicht beheben, indem Sie für das badChars-Array readonly (ReadOnly in Visual Basic) festlegen. Sie können das badChars-Array klonen und die Kopie zurückgeben, aber dies wirkt sich bedeutend auf die Leistung aus. Ausführliche Informationen finden Sie im folgenden Unterabschnitt Eigenschaften, die Arrays zurückgeben. Im folgenden Codebeispiel wird veranschaulicht, wie die GetInvalidPathChars-Methode geändert wird, um einen Klon des badChars-Arrays zurückzugeben.

Public Shared Function GetInvalidPathChars() As Char()
   Return CType(badChars.Clone(), Char())
End Function
public static char[] GetInvalidPathChars()
{
   return (char[])badChars.Clone();
}

Eigenschaften, die Arrays zurückgeben

Verwenden Sie Auflistungen, um ineffizienten Code aufgrund von Eigenschaften, die Arrays zurückgeben, zu vermeiden. Im folgenden Codebeispiel erstellt jeder Aufruf der myObj-Eigenschaft eine Kopie des Arrays. Dies hat zur Folge, dass in der folgenden Schleife 2n+1 Kopien des Arrays erstellt werden.

Dim i As Integer
For i = 0 To obj.myObj.Count - 1
   DoSomething(obj.myObj(i))
Next i
for (int i = 0; i < obj.myObj.Count; i++)
      DoSomething(obj.myObj[i]);

Weitere Informationen finden Sie unter Auswählen zwischen Eigenschaften und Methoden.

Felder, die Arrays zurückgeben

Verwenden Sie keine readonly-Felder (ReadOnly in Visual Basic) von Arrays. Andernfalls ist das Array schreibgeschützt und kann nicht geändert werden. Die Elemente im Array können hingegen geändert werden. Im folgenden Codebeispiel wird veranschaulicht, wie die Elemente des schreibgeschützten Arrays InvalidPathChars geändert werden können.

public sealed class Path
{
   private Path(){}
   public static readonly char[] InvalidPathChars = {'\"', '<', '>','|'}'
}
//The following code can be used to change the values in the array.
Path.InvalidPathChars[0] = 'A';

Verwenden von indizierten Eigenschaften in Auflistungen

Verwenden Sie eine indizierte Eigenschaft nur als Standardmember einer Auflistungsklasse oder Schnittstelle. Erstellen Sie keine Funktionsreihen in anderen Typen als Auflistungen. Ein bestimmtes Methodenschema, z. B. Add, Item und Count, weist darauf hin, dass der Typ eine Auflistung sein sollte.

Zurückgeben von leeren Arrays

Die String-Eigenschaft und die Array-Eigenschaft sollten niemals einen null-Verweis zurückgeben. Null ist in diesem Kontext möglicherweise schwierig zu verstehen. Ein Benutzer geht z. B. möglicherweise davon aus, dass der folgende Code funktioniert.

Public Sub DoSomething()
   Dim s As String = SomeOtherFunc()
   If s.Length > 0 Then
      ' Do something else.
   End If
End Sub
public void DoSomething()
{
   string s = SomeOtherFunc();
   if (s.Length > 0)
   {
      // Do something else.
   }
}

Gemäß der allgemeinen Regel werden null-Arrays, Arrays mit leerer Zeichenfolge ("") und leere Arrays (Arrays mit 0 Elementen) auf die gleiche Weise behandelt. Geben Sie statt eines null-Verweises ein leeres Array zurück.

Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.

Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.

Weitere Informationen zu Entwurfsrichtlinien finden Sie im Buch "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" von Krzysztof Cwalina und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.

Siehe auch

Referenz

Array

Konzepte

Verwendungsrichtlinien

Weitere Ressourcen

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken