Indications concernant l'utilisation des tableaux

Pour une description générale des tableaux et de leur utilisation, consultez Tableaux et System.Array, classe.

Tableaux et collections

Il se peut que les concepteurs de bibliothèques de classes aient à prendre des décisions délicates pour utiliser un tableau et retourner une collection. Bien que ces types disposent de modèles d'utilisation semblables, les caractéristiques de leurs performances sont différentes. En général. vous devez utiliser une collection quand les méthodes Add, Remove ou autres, destinées à manipuler la collection, sont prises en charge.

Pour plus d'informations sur l'utilisation des collections, consultez Collections et structures de données.

Utilisation d'un tableau

Ne retournez pas une instance interne d'un tableau. Cela permet au code appelant de changer le tableau. L'exemple suivant montre comment le tableau badChars peut être changé par n'importe quel code qui accède la propriété Path même si celle-ci n'implémente pas l'accesseur set.

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

Vous ne pouvez pas corriger le problème dans l'exemple précédent en rendant le tableau badChars readonly (ReadOnly en Visual Basic). Vous pouvez cloner le tableau badChars et retourner la copie mais cette opération n'est pas sans incidence sur les performances. Pour plus d'informations, consultez la sous-section « Propriétés retournant des tableaux » ci-dessous. L'exemple de code suivant montre comment modifier la méthode GetInvalidPathChars pour retourner un clone du tableau badChars.

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

Propriétés retournant des tableaux

Les propriétés retournant des tableaux peuvent se traduire par des inefficacités au niveau du code. Pour éviter celles-ci, utilisez des collections. Dans l'exemple de code suivant, tout appel à la propriété myObj crée une copie du tableau. Par conséquent, 2n+1 copies du tableau sont créées dans la boucle suivante.

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]);

Pour plus d'informations, consultez Choix entre des propriétés et des méthodes.

Champs retournant des tableaux

N'utilisez pas les champs readonly (ReadOnly en Visual Basic) des tableaux. Si vous le faites, le tableau est en lecture seule et ne peut pas être modifié mais les éléments du tableau peuvent l'être. L'exemple de code suivant montre comment les éléments du tableau en lecture seule InvalidPathChars peuvent être changés.

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';

Utilisation des propriétés indexées dans des collections

Utilisez uniquement une propriété indexée en tant que membre par défaut d'une interface ou d'une classe de collection. Ne créez pas de famille de fonctions dans des types qui ne sont pas des collections. Un modèle de méthodes telles que Add, Item et Count, indique que le type doit être une collection.

Retour de tableaux vides

Les propriétés String et Array ne doivent jamais retourner une référence null. Null peut être difficile à comprendre dans ce contexte. Par exemple, un utilisateur peut supposer que le code suivant fonctionnera.

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

En règle générale, les tableaux null, de chaînes vides ("") et vides (0 élément) doivent être traités de la même manière. Retournez un tableau vide au lieu d'une référence null.

Portions Copyright 2005 Microsoft Corporation. Tous droits réservés.

Portions Copyright Addison-Wesley Corporation. Tous droits réservés.

Pour plus d'informations sur les instructions de conception, consultez le livre « Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries » de Krzysztof Cwalina et Brad Abrams, publié par Addison-Wesley, 2005.

Voir aussi

Référence

Array

Concepts

Indications relatives à l'utilisation

Autres ressources

Instructions de conception pour le développement de bibliothèques de classes