2015-09-23 10 views
5

貧弱な言い回しを言い訳をしていますが、私はそれを説明する良い方法を見つけることができませんでした。コンパイル時に解決されないディレクティブはなぜですか?

私の理解では、C#はWORA言語です.MSILはアプリケーションが実際に実行されるまでコンパイルされないため、1台のマシンに書き込んで別のマシンに展開できます。

それでは、なぜそれがBitConverter.IsLittleEndianlike so定義されていることである。

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

BIGENDIANここでは、それがコンパイル時に解決されますことを意味プリプロセッサディレクティブ、です。したがって、開発者のマシンがリトルエンディアンでターゲットがビッグエンディアンを使用している場合、IsLittleEndianとなりますが、ターゲットマシンではtrueと表示されますか?

+0

'BIGENDIAN'はプリプロセッサシンボルであり、ディレクティブではありません。 '#if'が指令です。 –

答えて

3

いいえ、期待どおりに動作します。それが動作する理由は、ターゲットシステムにインストールされている.NETランタイムがそのターゲットシステム用にビルド/コンパイルされたためです。したがって、BitConverter.IsLittleEndianプロパティはfalseを返します。コードは単にそのプロパティを参照しているだけなので、実行時まで決定されません。

+0

このプロパティはコンパイル時の '#if BIGENDIAN'のため、実行時に参照するプロパティはありません。 – edtheprogrammerguy

+3

あなたのコードは 'BitConverter.IsLittleEndian'を使ってそのプロパティを参照します。コンパイルされているにもかかわらず、それはあなたのアプリで 'true/false'にハードコードされているわけではなく、そのプロパティを参照しています(**はランタイムで**ハードコードされているため、ランタイムの)。これはプロパティが 'const'ではなく' static readonly'として定義されているためです。それが 'const'だった場合、あなたは正しいでしょう:それはプロパティ参照ではありません。 – Mayoor

+0

あるマシン上でバイトコードにコンパイルされたdllのコピーを別のマシンにコピーすると、これは間違っていませんか?私は、バイトコードを使用することの全ポイントは、コンパイル後に.Net dllが移植可能であると考えていたことです。 –

関連する問題