refNesnenin 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 stringkez 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. refGerekmedikçe kullanmak iyi bir fikir değildir . Kullanarak refyö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, refanahtar 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;
}