2009-12-29 13 views
5

http://msdn.microsoft.com/en-us/library/ms229017.aspx'a göre, değer türleri "yığına veya diğer yapılarla * satırlara ayrılır". Yine de, the stack is an implementation detail, Eric Lippert, bunun bir uygulama detayı olduğunu belirtiyor.Yığın bir uygulama detayı mı, değil mi?

Anlayışım için bir uygulama detayı "a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to.". Belgelerin, bir belgeselde güvenebileceğimiz bir belgede listelenip listelenmediği ve bu yüzden de bir dezavantaj ayrıntısı olmadığı varsayımı olsa da, belgelemenin bir şartname olmadığını anlıyorum. Yani, yığın bir uygulama detayı mı, yoksa değil mi?

*: Bunu, yanlış olabilsem de, yapıların doğrudan yığın üzerinde değil, diğerlerinin içine de tahsis edilebileceği anlamına geldiğini anlıyorum.

+0

soru ile ilgili: http://stackoverflow.com/questions/1970894/struct-what-is-it-for/1970902#1970902 –

+0

Sadece bunu bir süre önce kopyaladım :) – RCIX

cevap

11

MSDN belgelerinde, Microsoft C# derleyicinin struct için kullandığı özel uygulama hakkında bilgi verilmektedir. Bu özel detaylar ECMA 334 C# spesifikasyonunda değildir; Onlar struct s semantiğinin bir parçası değildir. Bu nedenle, dokümantasyondaki bu detaylar uygulama detaylarıdır.

Eric Lippert'in bir yerde okumayı hatırladığını düşünüyorum (ya da tercih ettiğine göre, hangi düzeyde tercih ettiğini hatırlamıyorum) belgelerin struct s ile bağlantılı olarak yığından bahsetmemesini sağladı. Ben kazabilir miyim göreceğim. İşte

öyle, sen bağlı blog yazısı: Ben belgeleri en alakalı olanı odaklanmak olmadığını pişman

; Büyük ölçüde ilgisiz bir uygulama detayına odaklanarak, bu uygulama detayının önemini genişletiriz ve bir değer türünü neyin yararına yararlı kılan şeyin önemini gizleriz. “Yığın” ın ne demek olduğunu açıklayan tüm bu makalelerin, tam olarak “değere göre kopyalanan” anlamına geldiğini ve “yanlış değere göre kopyalamanın” yanlış anlaşılmasının ya da yanlış kullanımının hatalara neden olabileceğini açıklamak için zaman harcamasını diliyorum.

ECMA 334 C# belirtiminin ilgili bölümü §11'dir. "Yığın" kelimesinin bu bölümde hiç kullanılmadığını unutmayın. Bu bölüm sadece sözdizimini, struct'un takip değeri semantiğini, örtük olarak mühürlendiğini ve System.ValueType öğesinden devraldığını, struct türünde bir değişkenin atama oluşturduğunu, bir kopyanın struct değerini parametre olarak geçirerek bir kopyasını oluşturduğunu, struct s (struct tüm değer türü alanları varsayılan değerlerine ayarlanır ve tüm başvuru türü alanları null ayarlanır) varsayılan değerlere nasıl ayarlandığını, boks ve struct ait unboxing, struct s için this anlamını çevreleyen kurallar ve struct s için saha başlatma, kurucular, yıkıcılar ve statik kurucular nasıl çalışır. Yine yığınlardan bahsedilmiyor. Hiç.

Yığın, bir uygulama detayıdır, struct'un semantiklerinin bir parçası değildir.

1

C# değer türleri için, 'yığın' bir uygulama detayıdır çünkü değer türünde gerçekleştirilen her güvenli işlem, yapının yığında veya yığınta ayrılıp ayrılmadığına dik olarak aynı şekilde davranır. Adresin alınması ve doğrudan kullanılması (örn. Eski API'ler aracılığıyla) gibi bir fark yaratacağı işlemler (yani, ayrılmış bir yığın çerçeveye başvurma gibi) ile ilgili işlemler, güvenli olmayan ve hatalı kullanımlardır (ör. bir Marshaling API'sini kullanarak).