Array passaggio di parametri in C #: perché è implicito per riferimento?
-
25-09-2019 - |
Domanda
Si supponga il seguente codice, senza alcuna parola chiave ref
, che ovviamente non sostituirà la variabile passata, dal momento che è passato come valore.
class ProgramInt
{
public static void Test(int i) // Pass by Value
{
i = 2; // Working on copy.
}
static void Main(string[] args)
{
int i = 1;
ProgramInt.Test(i);
Console.WriteLine(i);
Console.Read();
// Output: 1
}
}
Ora per avere quella funzione di lavoro come previsto, si potrebbe aggiungere la parola chiave ref
come al solito:
class ProgramIntRef
{
public static void Test(ref int i) // Pass by Reference
{
i = 2; // Working on reference.
}
static void Main(string[] args)
{
int i = 1;
ProgramInt.Test(ref i);
Console.WriteLine(i);
Console.Read();
// Output: 2
}
}
Al momento sto perplesso sul motivo per cui i membri di matrice quando passavano nelle funzioni sono implicitamente passati per riferimento. Non sono i tipi di valore array?
class ProgramIntArray
{
public static void Test(int[] ia) // Pass by Value
{
ia[0] = 2; // Working as reference?
}
static void Main(string[] args)
{
int[] test = new int[] { 1 };
ProgramIntArray.Test(test);
Console.WriteLine(test[0]);
Console.Read();
// Output: 2
}
}
Soluzione
No, gli array sono classi, che significa che sono tipi di riferimento.
Altri suggerimenti
Gli array non sono passati per riferimento. Riferimenti ad array sono passati per valore. Se è necessario cambiare ciò matrice un passato in punti variabili di matrice a (ad esempio per cambiare la dimensione della matrice), la variabile deve essere passato per riferimento.
Un buon modo per ricordare questo è:
- "ref" fa un alias per un variabile
- un array è un insieme di variabili ; ogni elemento è una variabile.
Quando si passa una matrice normalmente, si passa un insieme di variabili . Le variabili della collezione non cambiano.
Quando si passa un array con "ref" allora sei dare un nuovo nome alla variabile che contiene la matrice .
Quando si passa un elemento di matrice normalmente si passa il valore della variabile .
Quando si passa un elemento di matrice - una variabile -. Con "ref", sei dare un nuovo nome a quella variabile
ha senso?
Si può immaginare il superamento di un array di 2 milioni di elementi per valore? Ora immaginate che il tipo di elemento è decimal
. Si dovrà copiare intorno 240MB 30.5175781MB dei dati.
Come indicato da riferimento MSDN , gli array sono oggetti ( System.Array è il tipo base astratta di tutte le matrici ) e gli oggetti sono passati per riferimento.
Oltre a tipi di dati di base non è possibile passare qualsiasi altra cosa come passaggio per valore, Array è la raccolta di tipi di dati fondamentali anche permettendo passaggio per valore sulla raccolta creerebbe più copie di collezione che sarebbe male sulle prestazioni.