Istruzioni per l'uso delle matrici

Per una descrizione generale delle matrici e del relativo uso, vedere Matrici e Classe System.Array.

Confronto tra matrici e insiemi

Durante la progettazione delle librerie di classi potrebbe essere difficile decidere quando utilizzare una matrice o restituire un insieme. Sebbene tali tipi abbiano modelli d'uso simili, le relative prestazioni hanno caratteristiche diverse. In generale, è opportuno utilizzare un insieme quando sono supportati i metodi Add e Remove o altri metodi per la modifica dell'insieme.

Per ulteriori informazioni sull'uso degli insiemi, vedere Raggruppamento dei dati in insiemi.

Uso delle matrici

Non restituire un'istanza interna di una matrice, poiché ciò consente al codice chiamante di modificare la matrice. Nell'esempio riportato di seguito viene illustrato come la matrice badChars possa essere modificata da qualsiasi codice in grado di accedere alla proprietà Path, sebbene la proprietà non implementi la funzione di accesso set.

Imports System
Imports System.Collections
Imports Microsoft.VisualBasic

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

      Private Property Path
         Get
         End Get
         Set
         End Set
      End Property

      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
[C#]
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);
      }
   }
}

Il problema dell'esempio precedente può essere corretto definendo l'insieme badChars come readonly (ReadOnly in Visual Basic). In alternativa, è possibile duplicare l'insieme badChars prima della restituzione di un valore. Nell'esempio riportato di seguito viene illustrato come modificare il metodo GetInvalidPathChars in modo da restituire un duplicato dell'insieme badChars.

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

Non utilizzare campi readonly (ReadOnly in Visual Basic) delle matrici. In caso contrario, la matrice è in sola lettura e non può essere modificata, mentre gli elementi della matrice risultano modificabili. Nell'esempio riportato di seguito viene illustrato come possono essere modificati gli elementi della matrice in sola lettura InvalidPathChars.

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

Uso delle proprietà indicizzate negli insiemi

Utilizzare una proprietà indicizzata solo come membro predefinito di un'interfaccia o di una classe Collection. Non creare gruppi di funzioni nei tipi che non sono insiemi. Un modello di metodi, ad esempio Add, Item e Count, indica che il tipo deve essere un insieme.

Proprietà con valori di matrici

Utilizzare gli insiemi per evitare di creare codice non efficiente. Nell'esempio di codice seguente ciascuna chiamata alla proprietà myObj crea una copia della matrice. Di conseguenza verranno create 2n+1 copie della matrice nel ciclo riportato di seguito.

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

Per ulteriori informazioni, vedere l'argomento Confronto tra proprietà e metodi.

Restituzione di matrici vuote

Le proprietà String e Array non devono mai restituire un riferimento null. In questo contesto un riferimento null può non essere facilmente comprensibile. Un utente, ad esempio, può presumere che il seguente codice funzionerà.

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

Come regola generale, è necessario che null, la stringa vuota ("") e le matrici vuote (0 elementi) vengano gestite allo stesso modo. Restituire una matrice vuota, anziché un riferimento null.

Vedere anche

Istruzioni di progettazione per gli sviluppatori di librerie di classi | Classe System.Array