2015-09-23 11 views
5

Przepraszam za kiepskie sformułowanie, ale nie mogłem znaleźć lepszego sposobu na wyjaśnienie tego.Dlaczego BIGENDIA jest dyrektywą, jeśli nie została rozwiązana podczas kompilacji?

Z mojego rozumowania, C# jest językiem WORA - możesz napisać go na jednym komputerze i wdrożyć na innym, ponieważ MSIL nie jest skompilowany, dopóki aplikacja nie zostanie faktycznie uruchomiona.

Więc dlaczego jest tak, że BitConverter.IsLittleEndian definiuje like so:

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

BIGENDIAN tutaj jest dyrektywa preprocesora, co oznacza, że ​​jest on rozwiązany w czasie kompilacji. Więc jeśli maszyna dewelopera jest mało zaawansowana, a cel używa dużego endianu, będzie IsLittleEndian nadal raportować true na komputerze docelowym?

+0

'BIGENDIAN' jest symbolem preprocesora, a nie dyrektywy. '# if' jest dyrektywą. –

Odpowiedz

3

Nie, będzie działać zgodnie z oczekiwaniami. Powodem, dla którego to zadziała, jest to, że środowisko wykonawcze .NET zainstalowane w systemie docelowym zostało zbudowane/skompilowane dla tego docelowego systemu, więc jego właściwość powróci BitConverter.IsLittleEndian. Właściwość zwróci false. Twój kod odwołuje się do tej właściwości, dlatego nie jest określany do czasu wykonania.

+0

Właściwość jest czasem kompilacji '#if BIGENDIAN', więc nie ma właściwości do odniesienia w czasie wykonywania. – edtheprogrammerguy

+3

Twój kod odwoła się do tej właściwości za pomocą 'BitConverter.IsLittleEndian'. Nawet jeśli jest skompilowany, nadal odwołuje się do tej właściwości, nie jest zakodowany na sztywno na "true/false" w twojej aplikacji (** jest zakodowany w środowisku wykonawczym, dlatego każda architektura miałaby swoją własną wersję środowiska wykonawczego). Wynika to z tego, że właściwość jest określana jako 'static readonly' zamiast' const'. Jeśli był to "const", to byłby poprawny: nie byłby to odnośnik do właściwości. – Mayoor

+0

Czy to nie pójdzie źle, jeśli weźmiesz kopię biblioteki dll skompilowanej do kodu bajtowego na jednym komputerze i skopiujesz go do innego? Sądziłem, że cały sens używania kodu bajtowego był taki, że biblioteki .NET powinny być przenośne po kompilacji. –

Powiązane problemy