Bir yapı, özünde, alanların toplamından ne fazlası ne de azıdır. .NET'te bir yapının bir nesne "gibi davranması" mümkündür ve her yapı türü için .NET örtük olarak aynı alanlara ve yöntemlere sahip bir yığın nesnesi türü tanımlar - bir yığın nesnesi olarak - bir nesne gibi davranır. . Böyle bir öbek nesnesine ("kutulu" yapı) bir referans tutan bir değişken, referans anlambilimini sergileyecektir, ancak bir yapıyı doğrudan tutan bir değişken basitçe bir değişkenlerin toplamıdır.
Bence yapı-sınıf karmaşasının çoğu, yapıların çok farklı tasarım yönergelerine sahip olması gereken çok farklı iki kullanım durumuna sahip olmasından kaynaklanıyor, ancak MS yönergeleri bunları birbirinden ayırmıyor. Bazen bir nesne gibi davranan bir şeye ihtiyaç vardır; bu durumda, MS yönergeleri oldukça mantıklıdır, ancak "16 bayt sınırı" muhtemelen daha çok 24-32 gibi olmalıdır. Ancak bazen ihtiyaç duyulan şey değişkenlerin bir araya toplanmasıdır. Bu amaçla kullanılan bir yapı, basitçe bir grup genel alandan ve muhtemelen birEquals geçersiz kılma, ToStringgeçersiz kılma veIEquatable(itsType).Equalsuygulama. Alanların toplamaları olarak kullanılan yapılar nesne değildir ve öyle görünmemelidir. Yapının bakış açısından, alanın anlamı "bu alana yazılan son şey" den daha fazla veya daha az olmamalıdır. Herhangi bir ek anlam müşteri koduna göre belirlenmelidir.
Örneğin, bir değişken toplama yapısının üyeleri varsa Minimumve Maximumyapının kendisi bunu vaat etmemelidir Minimum <= Maximum. Parametre olarak böyle bir yapıyı alan kod, ayrı Minimumve Maximumdeğerler aktarılmış gibi davranmalıdır . Bundan Minimumdaha büyük olmayan Maximumbir gereksinim, bir Minimumparametrenin ayrı olarak geçirilmiş olandan daha büyük olmaması şartı olarak görülmelidir Maximum.
Bazen dikkate alınması gereken kullanışlı bir model, aşağıdaki gibi bir ExposedHolder<T>sınıfa sahip olmaktır :
class ExposedHolder<T>
{
public T Value;
ExposedHolder() { }
ExposedHolder(T val) { Value = T; }
}
Biri varsa List<ExposedHolder<someStruct>>, nerede someStructbir değişken toplayarak yapı, tek gibi şeyler yapabilir olduğunu myList[3].Value.someField += 7;, ancak vererek myList[3].Valuediğer koda o içeriğini verecek Valueo bunu değiştirmek için bir araç vererek yerine. Aksine, eğer biri a kullanılıyorsa List<someStruct>, kullanmak gerekli olacaktır var temp=myList[3]; temp.someField += 7; myList[3] = temp;. Değiştirilebilir bir sınıf türü kullanılıyorsa, içeriğinin myList[3]dış koda sunulması , tüm alanların başka bir nesneye kopyalanmasını gerektirir. Eğer biri değişmez bir sınıf türü veya "nesne-tarzı" bir yapı kullanırsa, şunun myList[3]dışında olduğu gibi yeni bir örnek oluşturmak gerekecektir.someField ve sonra bu yeni örneği listeye .
Ek bir not: Çok sayıda benzer şeyi depoluyorsanız, bunları muhtemelen iç içe geçmiş yapı dizilerinde depolamak, tercihen her dizinin boyutunu 1K ile 64K arasında tutmaya çalışmak iyi olabilir. Yapı dizileri özeldir, çünkü indeksleme içerisindeki bir yapıya doğrudan bir referans verecektir, bu nedenle kişi "a [12] .x = 5;" diyebilir. Dizi benzeri nesneler tanımlanabilmesine rağmen, C # bu tür sözdizimini dizilerle paylaşmalarına izin vermez.