SORU
9 EKİM 2008, PERŞEMBE


Neden 'ref' bir nesne geçerken anahtar kelime kullanmak?

Eğer bir yöntem, bir nesne taşıyorum, niye ref anahtar sözcüğü kullanmalıyım? Bu varsayılan davranışı zaten değil mi?

Örneğin:

class Program
{
    static void Main(string[] args)
    {
        TestRef t = new TestRef();
        t.Something = "Foo";

        DoSomething(t);
        Console.WriteLine(t.Something);
    }

    static public void DoSomething(TestRef t)
    {
        t.Something = "Bar";
    }
}


public class TestRef
{
    public string Something { get; set; }
}

Çıktı "Bar" olan nesneyi referans olarak kabul edildi anlamına gelir.

CEVAP
9 EKİM 2008, PERŞEMBE


Eğer nesne değiştirmek isterseniz ref Pass:

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";
}

Bir Şey aradıktan sonra, t orijinal başvurmuyor 'yeni TestRef', ama tamamen farklı bir nesne anlamına gelir.

Bu değişmez bir nesnenin değerini değiştirmek, bir dize örnek istiyorsanız çok yararlı olabilir. Oluşturulduktan sonra bir dize değeri değiştiremezsiniz, ama bir ref kullanarak, farklı bir değeri olan bir dize değiştiren bir işlev oluşturabilirsiniz.

Diğer insanlar söz Gibi. Edit: Gerekli olmadıkça ref kullanmak iyi bir fikir değildir. Ref kullanarak yöntemi arayanlar bu olasılığı ele sağlamak için kodlanmış olması gerekir yöntemi başka bir şey için argüman değiştirmek için özgürlük verir.

Ayrıca. Parametre türü bir nesne, o nesne değişkenleri her zaman nesne için referans olarak hareket ederler. Bu, ref anahtar sözcüğü kullanıldığında, bir başvuru için bir başvuru var demektir. Bu yukarıda verilen örnekte açıklandığı gibi şeyler yapmanızı sağlar. Ama, ne zaman parametresi türü bir ilkel değer (örneğin int), o zaman eğer bu parametre atanır içinde yöntemi, değeri argüman olarak iletilen değişmiş olacak sonra yöntemi döndürür:

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;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jay Will

    Jay Will

    19 NİSAN 2006
  • Rachel Talbott

    Rachel Talbo

    26 Ocak 2011
  • Videojug

    Videojug

    25 EKİM 2006