2015-09-23 3 views
5

Entschuldigen Sie die schlechte Formulierung, aber ich konnte keinen besseren Weg finden, es zu erklären.Warum ist BIGENDIAN eine Direktive, wenn sie nicht zur Kompilierzeit aufgelöst wird?

Aus meiner Sicht ist C# eine WORA-Sprache - Sie können es auf einem Computer schreiben und auf einem anderen bereitstellen, da der MSIL erst kompiliert wird, wenn die Anwendung ausgeführt wird.

Also warum ist es dann, dass BitConverter.IsLittleEndianlike so definiert:

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

BIGENDIAN hier ist eine Präprozessordirektive, was bedeutet, dass es zum Zeitpunkt der Kompilierung aufgelöst wird. Wenn also die Maschine des Entwicklers Little Endian ist und das Ziel Big Endian verwendet, meldet weiterhin true auf dem Zielcomputer?

+0

'BIGENDIAN' ist ein Präprozessorsymbol, keine Direktive. '# if' ist die Richtlinie. –

Antwort

3

Nein, es wird wie erwartet funktionieren. Der Grund dafür ist, dass die .NET-Runtime, die auf dem Zielsystem installiert wurde, für dieses Zielsystem erstellt/kompiliert wurde. Daher wird die BitConverter.IsLittleEndian-Eigenschaft false zurückgegeben. Ihr Code verweist einfach auf diese Eigenschaft und wird daher erst zur Laufzeit bestimmt.

+0

Die Eigenschaft ist eine Kompilierungszeit, die ein "#if BIGENDIAN" enthält, sodass es keine Eigenschaft gibt, die zur Laufzeit referenziert werden kann. – edtheprogrammerguy

+3

Ihr Code wird diese Eigenschaft mit 'BitConverter.IsLittleEndian' referenzieren. Selbst wenn es kompiliert wird, verweist es immer noch auf diese Eigenschaft, die in Ihrer App nicht fest auf "Wahr/Falsch" codiert ist (sie ** ist in der Laufzeit fest codiert), weshalb jede Architektur ihre eigene Version hat der Laufzeit). Dies liegt daran, dass die Eigenschaft als "statisch readonly" und nicht als "const" definiert ist. Wenn es "const" wäre, dann hätten Sie Recht: Es wäre kein Eigentumsreferenz. – Mayoor

+0

Geht das nicht schief, wenn Sie eine Kopie der DLL, die auf einem Computer in Byte-Code kompiliert wurde, kopieren und an einen anderen kopieren? Ich dachte, dass der ganze Punkt der Verwendung von Byte-Code war, dass .NET-DLLs nach der Kompilierung portierbar sein sollten. –

Verwandte Themen