Bu, sızdıran bir soyutlama durumudur. Bir özellik, aslında bir yöntemdir olsun ve set gösterilen indekse için erişimcileri get_Index () ve set_Index yöntemlerine derlenmiş olsun. Derleyici, bu gerçeği gizleyerek harika bir iş çıkarır, örneğin bir özelliğe atamayı otomatik olarak karşılık gelen set_Xxx () yöntemine çevirir.
Ancak, bir yöntem parametresini referans olarak ilettiğinizde bu daha da artar. Bu, JIT derleyicisinin geçirilen bağımsız değişkenin bellek konumuna bir işaretçi iletmesini gerektirir. Sorun şu ki, bir özelliğin değerini atamak, ayarlayıcı yöntemini çağırmayı gerektirir. Çağrılan yöntem, geçirilen değişken ile geçirilen özellik arasındaki farkı söyleyemez ve bu nedenle bir yöntem çağrısının gerekli olup olmadığını bilemez.
Dikkat çekici olan, bunun aslında VB.NET'te çalışmasıdır. Örneğin:
Class Example
Public Property Prop As Integer
Public Sub Test(ByRef arg As Integer)
arg = 42
End Sub
Public Sub Run()
Test(Prop) '' No problem
End Sub
End Class
VB.NET derleyicisi bunu, C # ile ifade edilen Run yöntemi için bu kodu otomatik olarak oluşturarak çözer:
int temp = Prop;
Test(ref temp);
Prop = temp;
Ayrıca kullanabileceğiniz geçici çözüm budur. C # ekibinin neden aynı yaklaşımı kullanmadığından tam olarak emin değilim. Muhtemelen, potansiyel olarak pahalı alıcı ve ayarlayıcı çağrılarını gizlemek istemedikleri için. Ya da ayarlayıcı, özellik değerini değiştiren yan etkilere sahip olduğunda elde edeceğiniz tamamen teşhis edilemez davranış, atamadan sonra kaybolurlar. C # ve VB.NET arasındaki klasik fark, C # "sürpriz yok", VB.NET "yapabiliyorsanız çalışmasını sağlayın".