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