C # 'daki Sabitler


9

Derleyici neden montaj meta verilerinde sabit değerler depolar? Derleme meta verilerinden doğrudan Ara Dil koduna gömülüyorlar mı?


1
bu gerçekten '
neden'e hitap etmiyor

Bu soru ile kafam karıştı. Meta verilerde değilse başka nerede saklanabilirler ? Soruyu netleştirebilir misiniz?
Eric Lippert

Yanıtlar:


4

Bunu düşünmenin en iyi yolu şudur: Derleme zamanında bir sabit, kullanıldığı bir değişmez değere dönüştürülür.

Tanımlandığı mecliste tezahürün içine girmesinin tek nedeni, onu tüketiciler için erişilebilir kılmaktı. Belirli bir türün bir parçasıdır ve bu türün meta verileri, onu kullanan montajlarda değil, montajında ​​saklanır.

Bu nedenle, tüketimde satır içi bir değişmez değerdir ve meta verilerdeki sarf malzemesi türü kapsüllenmiş bir özellik veya alandır.


2

Kendimi uzun süre araştırdım ve bir kitaptan bunun sebebi olabileceğini buldum ...

Sabit değerler hiçbir zaman değişmediğinden, sabitler tanımlayıcı türün bir parçası olarak kabul edilir. Bu nedenle sabitleri tanımlamak meta veri oluşturur.


1

Sanırım iki meclisi karıştırıyorsun.

Sabit, yalnızca tanımlandığı derlemedeki meta verilerde depolanır . Meta veriler, bir derlemedeki tüm türler ve üyeler hakkında bilgi içerir ve sabitler üyedir.

Sabit hakkında hiçbir bilgi kullanıldığı montajda depolanmaz . Sabit değer, tıpkı sabit sayı veya dizeyi doğrudan kaynağa yazmışsınız gibi doğrudan IL'de kullanılır.

Bir örnek: Uygulamalarımdan biri, veritabanı tablolarını ve alanlarını tanımlamak için çok fazla sabit kullanır. Yalnızca tüm sabitleri içeren bir derleme var.

Uygulamayı oluşturduğumda, Visual Studio'daki "sabitler" derlemesine başvuru ekliyorum. Derleme yalnızca sabitleri içerdiğinden, uygulamamda herhangi bir başvuru yoktur ve çalışma zamanında "sabitler" derlemeye gerek yoktur.


2
Bu, sabitlerin neden meta verilerde depolandığını gerçekten açıklamaz. Nedeni etrafında dans ediyor, ama OP'nin iki meclisi karıştırdığını sanmıyorum. Bunu iki derleme sorunu olarak görüyorsunuz çünkü iki derleme kullanıyorsunuz, ancak uygulamanın yaygın olduğunu düşünmüyorum; sabitler tipik olarak kullanıldıkları aynı montajda tanımlanır.
Robert Harvey

@RobertHarvey Tipik vaka varsayımı, birçok girişimci C # meslektaşımızın becerisini abartır, birçok kez meslektaşlarınıza bir const'un ne olduğunu ve bunları meclislerde neden aramamanızı açıklamak zorunda kaldım.
Jimmy Hoffa

1

Sabitler derleme zamanında bilinir ve daha sonra derlemenin meta verilerinde saklanır. Bu, yalnızca ilkel türler için sabitleri tanımlayabileceğiniz anlamına gelir.

Evet, doğrudan meta verilerden yüklenir. Çalışma zamanında bellek ayırma olmaz.


1
Ondalık ilkel bir tür değildir, ancak ondalık sabitleri yapabilirsiniz. Ve sabitin boş olması koşuluyla, herhangi bir referans türünün sabitlerini yapabilirsiniz.
Eric Lippert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.