variable - passaggio parametri per valore o riferimento c#
Cosa significano ref, val e out sui parametri del metodo? (3)
Sto cercando una risposta chiara, concisa e accurata.
Idealmente come la risposta vera e propria, anche se i link a buone spiegazioni sono ben accetti.
Questo vale anche per VB.Net, ma le parole chiave sono diverse: ByRef
e ByVal
.
Una nota aggiuntiva su ref vs. out: la distinzione tra i due viene applicata dal compilatore C #. Il CLR non distingue tra out e ref. Ciò significa che non puoi avere due metodi le cui firme differiscono solo per un out o un ref
void foo(int value) {}
// Only one of the following would be allowed
// valid to overload with ref
void foo(ref int value) {}
// OR with out
void foo(out int value) {}
out
significa che il parametro sarà inizializzato con il metodo:
int result; //not initialised
if( int.TryParse( "123", out result ) )
//result is now 123
else
//if TryParse failed result has still be
// initialised to its default value (0)
ref
forzerà il passaggio del riferimento sottostante:
void ChangeMyClass1( MyClass input ) {
input.MyProperty = "changed by 1";
input = null;
//can't see input anymore ...
// I've only nulled my local scope's reference
}
void ChangeMyClass2( ref MyClass input ) {
input.MyProperty = "changed by 2";
input = null;
//the passed reference is now null too.
}
MyClass tester = new MyClass { MyProperty = "initial value" };
ChangeMyClass1( tester );
// now tester.MyProperty is "changed by 1"
ChangeMyClass2( ref tester );
// now tester is null
Una delle mie domande su gestisce anche questo argomento.
Gestisce "passa per riferimento" e "passa per valore" in diversi tipi di lingue, c # è incluso, quindi forse puoi trovare anche qualche informazione in più.
Fondamentalmente si tratta di:
- ref: il parametro con la parola chiave ref verrà passato per riferimento
- out: il parametro con la parola chiave out verrà trattato come parametro di output
ma questa è davvero la risposta più semplice che puoi dare, in quanto è un po 'più complessa di quanto non sia affermato qui