我想知道是否有辦法在運行時設置#define的值。有沒有辦法在運行時設置#define的值?
我假設在下面的代碼中存在針對Oracle特定和Sql Server特定的查詢。
#define oracle
// ...
#if oracle
// some code
#else
// some different code.
#endif
我想知道是否有辦法在運行時設置#define的值。有沒有辦法在運行時設置#define的值?
我假設在下面的代碼中存在針對Oracle特定和Sql Server特定的查詢。
#define oracle
// ...
#if oracle
// some code
#else
// some different code.
#endif
絕對不是,#define語句由預處理器編譯出的編譯器,甚至看到它之前 - 這樣的令牌「甲骨文」甚至不是在你的代碼,只是「1」或「0」。將#define更改爲全局變量或(更好)返回正確值的函數。
#if
是編譯時。你可以在你的構建過程中指定它(通過切換到msbuild/csc),但不是在運行時。排除代碼不存在。你可能會得到更好的建議(1):
沒有,預處理程序運行前進行編譯,可以在那個時候修改代碼,這是它的目的,如果你想在運行時根據什麼來切換行爲使用一個變量和正常條件邏輯。
您的設計是錯誤的。絕對錯誤。這在20年前可能是可以接受的,但是在這裏做你需要的東西有很多更好的技術。
您需要將所有數據訪問邏輯分解爲不依賴於實際實現(基於SQL或基於Oracle)的接口,然後使用DI/IoC在運行時注入所需的實現。它比聽起來簡單得多,工作極其出色,使您的代碼易於測試,並允許您自定義和更新應用程序,而無需執行完整的重新安裝。
相關問題:
https://stackoverflow.com/questions/45191/ioc-explain-and-more-important-when-to-use-it
Inversion of Control with .net
https://stackoverflow.com/questions/71041/which-single-iocdi-container-would-you-recommend-using-and-why
當然,存在更好的解決方案。也許這就是我問這個問題的原因。而且我還表示這是一個「假設」。即使存在,我也不會以這種方式使用解決方案。這個例子只是一個例子,以瞭解是否存在某種方式! – 2008-11-10 15:51:37