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
    }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top