In sostanza, ciò che stai chiedendo è il concetto di riferimenti .
C non ha una nozione formale di tipi di riferimento, quindi, quello che fai in C è prendere indirizzo e usare i puntatori. In C:
void xyz ( int *variable, int data ) {
*variable = data;
}
int x = 0;
xyz ( &x, 1 );
C ++ ha una nozione formale di tipi di riferimento, quindi è possibile utilizzarli come tali:
void xyz ( int &variable, int data ) {
variable = data;
}
int x = 0;
xyz ( x, 1 );
Si noti che poiché C ++ ha i tipi di riferimento , possono essere utilizzati per parametri formali e anche variabili locali, membri di istanze (campi), ecc.
C ++ ha anche dei puntatori quindi l'esempio C sopra funzionerà in C ++, sebbene per questi scopi, i tipi di riferimento siano preferiti (per uno, precludono l'aritmetica del puntatore).
C # non ha una nozione formale di tipi di riferimento, tuttavia, ha una nozione formale di out
parametri , quindi in C #:
void xyz ( out int variable, int data ) {
variable = data;
}
int x = 0;
xyz ( out x, 1 );
Si noti che C # ha anche dei puntatori; tuttavia, per utilizzarli è necessario utilizzare la parola chiave unsafe
.
Si noti inoltre che in C # tutte le variabili del tipo di oggetto sono riferimenti: questo include variabili locali, parametri formali e variabili di istanza (campi). Dichiarando una variabile di tipo di oggetto non si crea o non si alloca un oggetto, solo l'esecuzione di un'espressione di new
lo fa (che, naturalmente, possiamo mettere quello per l'inizializzatore di una variabile). (Le dichiarazioni stesse riservano spazio per il riferimento, un inizializzatore, se fornito, fornisce il valore iniziale per il riferimento.)
In C # (con la modalità di parametro predefinita di in
), le espressioni di tutti i tipi vengono passate dal chiamante al chiamato per valore (come se fosse assegnato), quindi assegnazione al parametro formale stesso, dall'interno del callee , non avrebbe effetto sulle variabili del chiamante (a meno che non si utilizzi ref
o out
). Quindi, i tipi di oggetto sono riferimenti che vengono passati per valore con il in
predefinito.
Mentre le modifiche al parametro formale sono visibili solo al chiamante se si utilizza ref
o out
, le modifiche agli oggetti di riferimento sono visibili al chiamante indipendentemente dalla modalità di passaggio dei parametri.
Per C #, questo vale per le istanze di classe ma non per le istanze struct come le variabili struct in realtà sono valori. (La dichiarazione di una variabile struct crea direttamente l'archiviazione per la struct.) Anche gli struct vengono passati per valore; le modifiche alle strutture nel callee non vengono riportate al chiamante (a meno che non si utilizzi ref
o out
).