2011-05-24 108 views
2

在C++中,我們可以這樣做:現在C#預處理器指令

struct { 
#if defined (BIGENDIAN) 
     uint32_t h; 
     uint32_t l; 
#else 
     uint32_t l; 
     uint32_t h; 
#endif 
    } dw; 

,在C#中並非如此簡單。我有一個方法來測試BigEndian,但在編譯時定義結構,我們如何在C#中獲得相同的效果?我在想,我可以選擇像「BoardBig」和「BoardLittle」這樣的課程,並使用工廠根據IsBigEndian支票獲得我需要的課程。而對於_WIN64檢查,我可以有類似「Position_64」和「Position_32」的類。這是一個好方法嗎?由於C#不能定義諸如#define IsBigEndian 1或者有什麼亞的語句,所以不知道該怎麼做。

回答

4

更新:正如其他海報指出的(upvoted),這不是C#中的字節順序的解決方案。

C#Conditional compilation directives

#if BIGENDIAN 
     uint32_t h;  
     uint32_t l; 
    #else 
     uint32_t l; 
     uint32_t h;   
    #endif 

順便說一句,你應該如果你能避免這些。使代碼更難以測試。

+0

你掛了JScript中的文檔。以下是C#版本:http://msdn.microsoft.com/en-us/library/aa691095.aspx – porges 2011-05-24 03:06:23

+0

D'oh! THX!........固定。 – 2011-05-24 03:07:58

2

在C#中有條件編譯,但您不能使用它來獲取不同的代碼,具體取決於endianess。對於託管語言,在編譯時不知道系統的永久性。

編譯器生成的IL代碼可以在大端和小端系統上執行。 JIT編譯器負責將IL代碼轉換爲本地機器代碼,並將數字文字轉換爲正確的格式。

您可以使用BitConverter.IsLittleEndian找出運行時的字節數。

+0

添加到BitConverter.IsLittleEndian的鏈接 – 2011-05-24 04:12:44

2

由於您不能將C#結構「存儲」映射到原始數據,因此沒有真正的優勢在於使用預處理器來達到此目的。因此,雖然C#具有可用於其他目的的預處理器功能,但我認爲它們在這裏對您不會有價值。

相反,只需要使用一個首選結構,並將特定情況下的低級別代碼轉換爲低級別代碼。下面是一個結構的big-endian和little-endian的處理爲例:

+0

看起來很有趣的閱讀。我看看。非常感謝 – David 2011-05-24 03:36:30