2011-04-12 42 views
0

根據我按下的按鈕,我可以在代碼中寫入以將變量設置爲true還是false?看下面的例子。C#if指令

如果不是,還有什麼其他方法可以實現類似效果?因爲我已經使用指令標記了不同模式的代碼,只希望開發人員可以選擇切換模式,但是現在我想給用戶選擇切換btn模式的選項。模式的選擇只在程序開始時給出,用戶不允許切換模式。要切換模式,他只能重新啓動程序。

如果不能使用指令,我可以使用什麼最快的方式? (注:該語句是所有解決方案圍繞)

鑑於我想達到的目的pseduocode:

void button_click(...){ 
    if(!CONDITION) 
     CONDITION = true; 
    else 
     CONDITION = false; 
} 


... 
#if CONDITION 
    //mode X with addtional steps 
#endif 

編輯: 4月13日 - 增加了更多的信息

+2

您的問題對我而言並不清楚。你想用按鈕切換成員布爾值? – Matthew 2011-04-12 17:18:04

+0

也許qn並不清楚......我的意思是if指令聲明貫穿整個由許多項目組成的解決方案。所以我想知道是否有一個快捷方式可以通過點擊一個按鈕來實現這些語句的執行(不僅僅是一個,而是多個),作爲用戶的功能實現。以前選擇執行這些語句或不是隻是開發人員,現在我想用戶也可以靈活地這樣做 – yeeen 2011-04-13 12:45:55

回答

5

您正在使用預處理指令並試圖從破壞目的的代碼中設置它,即使它是可能的(我敢肯定你不能)。爲什麼不使用常規布爾字段作爲標誌?

private bool Condition {get; set;} 
0

如果您詢問您是否可以根據代碼中的條件進行條件編譯,那麼答案是否定的。編譯器在編譯時必須知道你的程序集中包含什麼。你幾乎可以肯定地實現你正在嘗試的條件編譯,但是你試圖做什麼?

+0

我hv在qn – yeeen 2011-04-13 12:41:05

2

這是不可能的。 if語句在運行時執行,但預編譯指令#IF在編譯時執行。您需要在編譯時決定如何構建代碼,以及在項目中的某個位置(在項目的屬性中)還是在源文件的頂部,將CONDITION設置爲該給定構建所需的任何內容。

如果這確實需要一個運行時決策,那麼您需要包含所有可能的代碼路徑並在運行時決定採用哪一個。

+0

+1中做出了更多解釋:您的答案非常全面... – 2011-04-12 17:24:33

+0

那麼,我現在可以做什麼,如果我不能使用指令?用這些語句向代碼的每個部分添加一個使用全局變量的布爾檢查? – yeeen 2011-04-13 12:43:24

0

'#IF'指令用於條件編譯,這意味着它會查找在編譯時定義的令牌,並且字面上編譯或不編譯特定的代碼。這意味着非編譯代碼不是您的程序的一部分,並且不能在運行時使用。如果要在運行時更改行爲,則需要修改代碼以使用普通標誌而不是條件編譯。也就是說,您可能需要考慮更深入的設計審查,因爲添加基於配置標誌的新分支功能可能會非常迅速地導致混亂的代碼。

0

這些指令提供了有條件地跳過源文件的段落,報告錯誤和警告條件以及描述源代碼的不同區域的功能。 您不能在運行時更改它們。

0

#IF指令是一個預處理器選項,一旦編譯代碼,就不會有意義,因此編譯後不能使用它們來控制程序流。

至於你的其他選擇,你應該能夠將其轉換爲類級別的變量,而輕鬆,但消極的一面,你的代碼將與if CONDITION ... else ...語句充斥的是可能最終被在痛苦屁股管理。

另一個更適合OOP的選項是實現State模式。您可以將每個「條件」的行爲封裝到自己的狀態中,並在模式中在它們之間切換。這可能是兩個國家(最可能是)的矯枉過正。

另請參見:http://www.dofactory.com/Patterns/PatternState.aspx

+0

我不是說2 diff狀態,而是2 diff模式。一種模式只有更多的語句才能執行,然後執行另一種模式。我想我只會在程序開始時執行模式的選擇,而不是在程序執行期間,初始化語句的因素......我爲qn添加了更多信息,請檢查一下。 – yeeen 2011-04-13 12:49:50

+0

@yeeen:重新閱讀關於狀態模式的鏈接。它仍然會以一種漂亮,乾淨的方式覆蓋你想要的東西。 – 2011-04-13 14:56:43