, bir yapı örneği metodu yapı bir ekstra ref
parametresi olan bir statik yapı yöntemine anlama sahip olduğu yazın.
struct Blah {
public int value;
public void Add(int Amount) { value += Amount; }
public static void Add(ref Blah it; int Amount; it.value += Amount;}
}
yöntem çağırır:
someBlah.Add(5);
Blah.Add(ref someBlah, 5);
bir fark dışında anlama sahip: Bu durumda, bildirimleri verilen ikinci arama yalnızca someBlah
kesilebilir bir depolama konumu ise, müsaade edilecek (değişken, alan, vb.) ve salt okunur bir depo yeri veya geçici bir değer (bir mülkün okunması sonucu vb.) değilse.
Bu, .net dilinin tasarımcılarıyla bir sorunla karşı karşıya kaldı: salt okunur yapılardaki herhangi bir üye işlevinin kullanımını devre dışı bırakmak can sıkıcı olurdu, ancak üye işlevlerinin salt okunur değişkenlere yazmasına izin vermek istemediler. "Punt" yapmaya karar verdiler ve bunu bir salt okunur yapıda bir örnek yöntemini çağırmak, yapının bir kopyasını oluşturacak, bunun üzerindeki işlevi çağıracak ve sonra da atacaklardır. Bu, altta yatan yapıyı yazmayan örnek yöntemlerine yapılan çağrıları yavaşlatmanın etkisine sahiptir ve bunu yapmak için, salt okunur bir yapıda temel yapıyı güncelleyen bir yöntemi kullanma denemesi, farklı kırık semantik'u Yapıyı doğrudan geçtiyse elde edilir. Kopyalamadan alınan ekstra sürenin, kopya olmadan doğru olmayacak olan durumlarda doğru semantiği hemen hemen hiç vermeyeceğini unutmayın.
.net'teki en büyük pecer'lerden biri hala (en az 4.0 ve muhtemelen 4.5'den itibaren) hala bir yapı üyesi işlevinin this
değiştirip değiştirmediğini gösterebileceği bir öznitelik olmamasıdır.İnsanlar, yapıların mutasyona uğramış yöntemleri güvenli bir şekilde sunmalarına izin vermek için araçlar sağlamaktan ziyade, yapıların nasıl değişmez olması gerektiğine ilişkin olarak rağbet görürler. Bu, "immutable" yapıları denilen gerçeği yalan olmasına rağmen. Değişken depolama konumlarındaki tüm önemsiz olmayan değer türleri, tüm kutulu değer türleri gibi, değiştirilebilir. Bir "immutable" yapısını yapmak, yalnızca bir alanı değiştirmek istediğinde tüm yapıyı yeniden yazmayı zorunlu kılabilir, ancak struct1 = struct2
yapı1, tüm ortak ve özel alanlarını struct2'den kopyalayarak değiştirir ve struct için tür tanımında hiçbir şey yoktur Bunu önlemek için yapabilir (herhangi bir alanın olmaması hariç) yapı üyelerinin beklenmedik mutasyonlarını önlemek için hiçbir şey yapmaz. Dahası, iş parçacığı sorunları nedeniyle, yapılar kendi alanları arasında herhangi bir değişmez ilişkiyi yürütme yetenekleri bakımından çok sınırlıdır. IMHO, genel olarak, rastgele alan erişimine izin veren bir yapı için daha iyi olacaktır; bu da, bir yapıyı alan herhangi bir kodun, koşullara uymayan yapıların oluşumunu engellemeye çalışmaktan ziyade, alanlarının gerekli tüm koşulları karşılayıp karşılamadığını kontrol etmesi gerektiğini açıkça belirtmektedir.
Eric Lippert'in ["Mutant Readonly Structs"] başlıklı makalesine bakın. (Http://blogs.msdn.com/b/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx) –
* Neden iki tane beklemek mi? Okumak istediğini söyledin, neden değişmesini istiyorsun? –