2015-09-23 31 views
5

Kötü ifadeler için özür dilerim, ancak açıklamak için daha iyi bir yol bulamadım.BIGENDIAN neden derleme zamanında çözülmezse bir direktiftir?

Anlayışımdan, C# bir WORA dilidir - bunu bir makineye yazabilir ve başka bir tanesine dağıtabilirsiniz, çünkü MSIL uygulama aslında çalıştırılıncaya kadar derlenmez.

Öyleyse neden BitConverter.IsLittleEndianlike so tanımlandığını öyle:

burada
#if BIGENDIAN 
    public static readonly bool IsLittleEndian /* = false*/; 
#else 
    public static readonly bool IsLittleEndian = true; 
#endif 

BIGENDIAN o derleme sırasında çözümlenir anlamına geliyorsa bir yönergesidir vardır. Geliştiricinin makinesi endian ise ve hedef büyük endian kullanıyorsa, IsLittleEndian hala hedef makinede true rapor edecek mi?

+0

'BIGENDIAN' bir önişlemci sembolüdür, bir yönerge değildir. “If” dir. –

cevap

3

Hayır, beklendiği gibi çalışacaktır. Çalıştırılmasının nedeni, hedef sistemde kurulu olan .NET yürütücüsünün bu hedef sistem için oluşturulduğu/derlendiği için, özelliğinin false döndürülmesidir. Kodunuz sadece bu özellik referans gösteriliyor, bu yüzden çalışma zamanına kadar belirlenir.

+0

Özellik, bir '# BÜYÜK BÜTÜN 'bir derleme zamanıdır, dolayısıyla çalışma zamanında başvurulan bir özellik yoktur. – edtheprogrammerguy

+3

Kodunuz, 'BitConverter.IsLittleEndian' özelliğini kullanarak bu özelliği referans gösterecektir. Derlenmiş olsa bile, yine de, uygulamanızda "true/false" olarak kodlanmış değil, bu özellik referans olarak gösterilmektedir (**, çalışma zamanında hard-kodlanmıştır, bu yüzden her mimarinin kendi sürümü vardır. çalışma zamanının). Bunun nedeni, "const" yerine "static readonly" olarak tanımlanmaktır. Eğer 'const' ise, o zaman doğru olursunuz: bir özellik referansı olmaz. – Mayoor

+0

Tek bir makinede bayt koduna derlenmiş dll'nin bir kopyasını alıp farklı bir dosyaya basıyorsanız, bu yanlış olmaz mı? Bayt kodu kullanmanın bütün noktasını düşündüm. Net çekişlerin derlendikten sonra taşınabilir olması gerekiyordu. –