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







vb.net