ref
Nesnenin ne olduğunu değiştirmek istiyorsanız a değerini iletin :
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";
}
DoSomething çağırdıktan sonra t
, orijinali ifade etmez new TestRef
, ancak tamamen farklı bir nesneyi ifade eder.
Bu, değişmez bir nesnenin değerini değiştirmek istiyorsanız, örneğin a string
. Bir string
kez oluşturulduktan sonra değerini değiştiremezsiniz . Ancak a kullanarak ref
, farklı bir değere sahip başka bir işlev için dizeyi değiştiren bir işlev oluşturabilirsiniz.
Düzenleme: Diğer insanların belirttiği gibi. ref
Gerekmedikçe kullanmak iyi bir fikir değildir . Kullanarak ref
yönteme başka bir şey için argümanı değiştirme özgürlüğü verir, yöntemin arayanların bu olasılığı ele almaları için kodlanması gerekir.
Ayrıca, parametre türü bir nesne olduğunda, nesne değişkenleri her zaman nesneye referans olarak işlev görür. Bu, ref
anahtar kelime kullanıldığında bir referansa referansınız olduğu anlamına gelir . Bu, yukarıda verilen örnekte açıklandığı gibi işleri yapmanızı sağlar. Ancak, parametre türü ilkel bir değer olduğunda (örn. int
), Bu parametre yöntem içinde atanırsa, yöntem döndürüldükten sonra iletilen bağımsız değişkenin değeri değişir:
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;
}