2011-01-11 13 views
6

birisi bir referans tipi"ref" anahtar kelime ve referans tipleri benim takımımda

class A { /* ... */ } 

class B 
{  
    public void DoSomething(ref A myObject) 
    { 
     // ... 
    } 
} 

üzerinde ref anahtar kelimenin kendine özgü bir kullanım tökezledi böyle bir şey yapacağını aklı başında herhangi bir neden birisi var mı? Bunun için C#

+0

Ayrıca bkz [Bu soru] (http: // stackoverflow.com/questions/961717/c-what-is-the-use-of-ref-for-reference-type-variables). –

+0

Gerçekten, bu soruyu ararken ararken kaçırdım. Oldukça net olsa bile, Oded'in bahsettiği şeyin açık bir örneği için – Luk

cevap

12

sonra

class A 
{ 
    public string Blah { get; set; } 
} 

void Do (ref A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (ref a); 
Console.WriteLine(a.Blah); // Bar 

Let Ama sonra sadece

void Do (A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

eğer Metot, yönteme geçirilen değişkende kayıtlı referansı değiştirmesi gerekiyorsa, ref anahtar kelimesi,
+1

+1 numaralı iyi yakalama. –

+0

Çok teşekkürler, bu onu berrak hale getiriyor! – Luk

+0

@ Luk: Sevindim yardımcı oldu! :) – abatishchev

15

için kullanamıyorum. myObjectmyObject olarak değiştirilen nesneyi farklı bir değere referansı değiştirmek istiyorlarsa.

public void DoSomething(ref A myObject) 
{ 
    myObject = new A(); // The object in the calling function is now the new one 
} 

Şansı bu yapmak istedikleri ve ref gerekli değildir şey değildir vardır.

0
anahtar kelimesidir. Eğer ref'u kullanmazsanız, referansı değiştiremezsiniz sadece nesneyi değiştirir, nesnenin kendisi yöntemin dışında görünür olur.
this.DoSomething(myObject); 
// myObject will always point to the same instance here 

this.DoSomething(ref myObject); 
// myObject could potentially point to a completely new instance here 
0

Bu konuda özel bir şey yok. Bir yöntemden birkaç değer döndürmek istiyorsanız veya yalnızca bir argüman olarak ilettiğiniz nesneye dönüş değerini yeniden atamak istemiyorsanız, değişkenleri referans alırsınız. Bunun gibi

:

int bar = 4; 
foo(ref bar); 

yerine: Birkaç değerleri almak istiyorsanız

int bar = 4; 
bar = foo(bar); 

Veya:

int bar = 0; 
string foobar = ""; 
foo(ref bar, ref foobar); 
+0

Aslında OP, int türünden değil, türden türler için referans türleri hakkında konuşuyor. – abatishchev

+0

Yani referanslar değer türleriyle kullanılmıyor mu diyorsunuz? – peterthegreat

+0

afaik, no. Değer türleri her zaman, yani değere göre tamamen kopyalanır. Bu yüzden onlar – abatishchev

İlgili konular