Linee guida per l'utilizzo delle matrici

Per una descrizione generale delle matrici e del relativo utilizzo, vedere System.Array Class.

Matrici vs.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'utilizzo degli insiemi, vedere Insiemi e strutture di dati.

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

Il problema esposto nell'esempio precedente non può essere corretto definendo la matrice badChars come readonly (ReadOnly in Visual Basic). È possibile duplicare la matrice badChars e restituire la copia, ma questa operazione influisce in maniera significativa sulle prestazioni. Per ulteriori informazioni, vedere la sottosezione "Proprietà che restituiscono matrici" riportata di seguito. Nell'esempio di codice riportato di seguito viene illustrato come modificare il metodo GetInvalidPathChars in modo da restituire un duplicato della matrice badChars.

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

Proprietà che restituiscono matrici

Per evitare di creare codice non efficiente a causa di proprietà che restituiscono matrici, è necessario utilizzare degli insiemi. Nell'esempio di codice seguente ciascuna chiamata alla proprietà myObj crea una copia della matrice. Di conseguenza, nel seguente ciclo verranno create 2n+1 copie della matrice.

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

Per ulteriori informazioni, vedere Scelta tra proprietà e metodi.

Campi che restituiscono matrici

Non utilizzare i campi readonly (ReadOnly in Visual Basic) delle matrici. In caso contrario, la matrice risulta di sola lettura e non può essere modificata, mentre gli elementi della matrice risultano modificabili. Nell'esempio di codice riportato di seguito viene illustrato come possono essere modificati gli elementi della matrice di 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 una classe di insiemi o di un'interfaccia. Non creare gruppi di funzioni in tipi che non sono insiemi. Un modello di metodi, ad esempio Add, Item o Count, indica che il tipo deve essere un insieme.

Restituzione di matrici vuote

Le proprietà String e Array non devono mai restituire un riferimento null. Null può essere difficile da comprendere nel seguente contesto: 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
public void DoSomething()
{
   string s = SomeOtherFunc();
   if (s.Length > 0)
   {
      // Do something else.
   }
}

Come regola generale, null, la stringa vuota ("") e le matrici vuote (0 elementi) devono essere trattate nello stesso modo. Restituire una matrice vuota anziché un riferimento null.

Portions Copyright 2005 Microsoft Corporation. Tutti i diritti riservati.

Portions Copyright Addison-Wesley Corporation. Tutti i diritti riservati.

Per ulteriori informazioni sulle linee guida di progettazione, vedere “le linee guida di progettazione di Framework: Idiomi convenzioni, e modelli per libro raccolte riutilizzabili .NET„ di Krzysztof Cwalina e brad Abrams, emessi da Addison-Wesley, 2005.

Vedere anche

Riferimenti

Array

Concetti

Linee guida di utilizzo

Altre risorse

Linee guida di progettazione per lo sviluppo di librerie di classi