Elimi bir açıklamada deneyeceğim:
Bence değer türlerinin nasıl çalıştığını anlıyoruz? Değer türleri (int, long, struct vb.) Şeklindedir. Bunları ref komutu olmadan bir işleve gönderdiğinizde verileri KOPYALAR . İşlevdeki bu verilere yaptığınız her şey orijinali değil yalnızca kopyayı etkiler. Ref komutu GERÇEK verileri gönderir ve yapılan değişiklikler işlevin dışındaki verileri etkiler.
Kafa karıştırıcı kısma, referans türlerine bakın:
Bir referans türü oluşturalım:
List<string> someobject = new List<string>()
Yeni bir nesne oluşturduğunuzda, iki bölüm oluşturulur:
- Bir nesneye ilişkin verileri tutan bellek bloğu .
- Bu veri bloğuna bir referans (işaretçi).
Şimdi bir yöntemi ref olmadan bir yönteme gönderdiğinizde, veriyi DEĞİL referans işaretçisini KOPYALAR . Şimdi buna sahipsiniz:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Aynı nesneye işaret eden iki referans. Bir nesnedeki bir özelliği reference2 kullanarak değiştirirseniz, reference1 ile gösterilen aynı verileri etkiler.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Reference2'yi sıfırlar veya yeni verilere yönlendirirseniz, reference1'i veya veri referansı1'i etkilemez.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Gönderdiğiniz Şimdi ne zaman ne olur SomeObject bir yönteme ref tarafından? Gerçek bir referans için SomeObject yöntemine gönderilir. Artık verilere tek bir referansınız var:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Peki bu ne anlama geliyor? İki ana şey dışında ref ile değil, bir gönderi göndermeyle tamamen aynı davranır:
1) Yöntemin içindeki başvuruyu iptal ettiğinizde, yöntemin dışındaki başvuruyu geçersiz kılar.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Şimdi referansı tamamen farklı bir veri konumuna yönlendirebilirsiniz ve fonksiyonun dışındaki referans şimdi yeni veri konumuna işaret edecektir.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClass
gerekiyor Birclass
tür, yani bir başvuru türü gibi görünüyor . Bu durumda, ilettiğiniz nesne, / keywordmyFunction
olmadan çift tarafından değiştirilebilir . aynı nesneyi işaret eden yeni bir başvuru alır ve aynı nesneyi istediği kadar değiştirebilir. Fark, anahtar olur, olacaktır alınan aynı aynı nesneye başvuru. Bu , referansı başka bir nesneye işaret edecek şekilde değiştirmek olsaydı önemli olurdu .ref
out
myFunction
ref
myFunction
myFunction