Passa a ref
se vuoi cambiare l'oggetto:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
Dopo aver chiamato DoSomething, t
non si riferisce all'originale new TestRef
, ma si riferisce a un oggetto completamente diverso.
Ciò può essere utile anche se si desidera modificare il valore di un oggetto immutabile, ad es string
. A. Non è possibile modificare il valore di a una string
volta che è stato creato. Ma utilizzando a ref
, è possibile creare una funzione che modifica la stringa per un'altra che ha un valore diverso.
Modifica: come altri hanno già detto. Non è una buona idea usare a ref
meno che non sia necessario. L'utilizzo ref
dà al metodo la libertà di modificare l'argomento per qualcos'altro, i chiamanti del metodo dovranno essere codificati per assicurarsi di gestire questa possibilità.
Inoltre, quando il tipo di parametro è un oggetto, le variabili oggetto fungono sempre da riferimenti all'oggetto. Ciò significa che quando ref
viene utilizzata la parola chiave, si ottiene un riferimento a un riferimento. Ciò ti consente di fare le cose come descritto nell'esempio sopra riportato. Ma, quando il tipo di parametro è un valore primitivo (ad es. int
), Quindi se questo parametro è assegnato all'interno del metodo, il valore dell'argomento passato verrà modificato dopo che il metodo restituisce:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}