Int un tipo di riferimento o un tipo di valore?

So che un int è un tipo di valore, ma quali sono gli array di tipi di valore? Tipi di riferimento? Tipi di valore? Voglio passare un array a una funzione per controllare qualcosa. Dovrei semplicemente passare l’array, in quanto passerà il riferimento, o dovrei passarlo come riferimento?

Gli array sono meccanismi che consentono di trattare diversi elementi come una singola raccolta. Il Common Language Runtime (CLR) di Microsoft® .NET supporta matrici monodesmensionali, matrici multidimensionali e matrici frastagliate (matrici di matrici). Tutti i tipi di array derivano implicitamente da System.Array, che a sua volta deriva da System.Object. Ciò significa che tutti gli array sono sempre tipi di riferimento allocati nell’heap gestito e la variabile dell’app contiene un riferimento all’array e non all’array stesso.

https://msdn.microsoft.com/en-us/library/bb985948.aspx

Il test più semplice per il tipo di riferimento rispetto al tipo di valore è che i tipi di riferimento possono essere null , ma i tipi di valore non possono.

Le matrici (anche di tipi di valore come int) sono tipi di riferimento in C #.

http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx :

In C #, gli array sono in realtà degli oggetti. System.Array è il tipo di base astratto di tutti i tipi di array.

Per prima cosa voglio dirti che Array è un tipo di riferimento. Perché? Spiego di fare un esempio qui.

Esempio:

 int val = 0; // this is a value type ok int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap. 

Anche i tipi di riferimento possono essere nulli mentre i tipi di valore non possono.

tipo di valore memorizzato in Stack e tipo di riferimento memorizzato in Heap

È ansible passare alla matrice per funzionare usando out o ref. Solo i metodi di inizializzazione sono diversi.

Di Più..

La matrice stessa è un tipo di riferimento. I valori di tale matrice sono valori o tipi di riferimento determinati dal tipo di dati dell’array. Nel tuo esempio, la matrice è un tipo di riferimento ei valori sono tipi di valore.

Tutti gli array a dimensione singola implementano implicitamente IList , dove è il tipo di dati dell’array. È ansible utilizzare tale interfaccia come tipo di dati del parametro del metodo. È anche ansible utilizzare IEnumerable per il tipo di dati. In entrambi i casi (o anche se si usa solo int[] ) non si dovrebbe aver bisogno di passarlo esplicitamente come parametro ref .

Test per verificare se si tratta di un riferimento o di un tipo di valore:

 // we create a simple array of int var a1 = new int[]{1,2,3}; // copy the array a1 to a2 var a2 = a1; // modify the first element of a1 a1[0]=2; // output the first element of a1 and a2 Console.WriteLine("a1:"+a1[0]); // 2 Console.WriteLine("a2:"+a2[0]); // 2 //************************** // all the two variable point to the same array // it's reference type! //************************** 

Puoi testarlo online: https://dotnetfiddle.net/UWFP45

// Il riferimento all’array viene passato per valore. Questa è la fonte della confusione 🙂 …

  int[] test = { 1, 2, 3, 4 }; modifContenuSansRef(test); Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié modifTailleSansRef(test); Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée } static void modifContenuSansRef(int[] t) { t[0] = 99; } static void modifTailleSansRef(int[] t) { Array.Resize(ref t, 8); } 

Le matrici sono sempre di riferimento. Non importa che la matrice conterrà il tipo di valore come int o il tipo di riferimento come string. Quando dichiarate la matrice per esempio

int[] integers=new int[10] ;

la variabile di interi contiene solo un riferimento all’array che risiederà nell’heap.

Inoltre, vi sono molte persone che menzionano che è ansible differenziare il tipo di valore dal tipo di riferimento solo in base al fatto che la variabile potrebbe essere nullo o no. Vorrei menzionare che anche nei tipi di valore corrente c # può essere nullo

per esempio

 int? integer=null 

e non è un buon modo per identificare il tipo è il riferimento o il valore dipende solo dalla variabile dei fatti potrebbe essere nullo o no.

Solo un po ‘di intuizione:

Ad esempio, int rappresenta un singolo intero, int[] rappresenta un array di numeri interi.

Per inizializzare la matrice con dimensioni specifiche, puoi usare la new parola chiave, dando la dimensione tra parentesi quadre dopo il nome del tipo:

 //create a new array of 32 ints. int[] integers = new int[32]; 

Tutti gli array sono tipi di riferimento e seguono la semantica di riferimento. Quindi, in questo codice, anche se i singoli elementi sono tipi di valore primitivi, l’array di integers è un tipo di riferimento. Quindi se in seguito scrivi:

 int[] copy = integers; 

questo assegnerà semplicemente l’intera copia variabile per fare riferimento allo stesso array, non creerà una nuova matrice.

La syntax dell’array di C # è flessibile, consente di dichiarare gli array senza inizializzarli in modo che l’array possa essere dimensionato dynamicmente più avanti nel programma. Con questa tecnica, si sta fondamentalmente creando un riferimento nullo e successivamente si indica tale riferimento in una porzione allocata dynamicmente di posizioni di memoria richieste con una new parola chiave:

 int[] integers; integers = new int[32]; 

Grazie.