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
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;
}
Neden verim sıradan bir IEnumerable ku...
Neden bu parametreler anahtar kelime k...
Neden nesne yerine bir işaretçi kendis...
Nasıl "bu" JavaScript bir ne...
Neden anahtar kelime "son" J...