2010-06-18 128 views
2

我需要在我的MVC項目中實現一個HtmlHelper擴展,只是在DEBUG模式下輸出一些字符串,而不是在RELEASE中。 我第一次嘗試是:MVC助手擴展問題

[Conditional("DEBUG")] 
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString) 
{ 
    return testString; 
} 

但很明顯,這將使編譯錯誤:

"The Conditional attribute is not valid because its return type is not void."

所以我的理解是,一旦你設置[Conditional]屬性,它不會允許任何返回?爲什麼?

有沒有另一種方法來實現這種功能?任何幫助將非常感激。

回答

6

你可以使用一個preprocessor directive

public static string TestStringForDebugOnly(this HtmlHelper helper, string testString) 
{ 
#if DEBUG 
    return "debug"; 
#else 
    return "other"; 
#endif 
} 

至於你原來的問題,爲什麼在section 17.4.2 of the C# specification偷看錶示:

[A] conditional method must have a return type of void

我只能推測出爲什麼設計師該語言決定了這一點,但我敢於猜測這是因爲如果條件爲false,C#編譯器不會將方法調用編譯爲IL,所以實際上就好像您從未調用該方法(這會導致某些明顯的問題如果預期有返回值,就會在運行時產生衝擊!)

+0

完美!謝謝你,先生。 – BeCool 2010-06-18 05:34:25

+0

+1對於您如何閱讀語言設計師的思想。我從來沒有理解人們想如何做到這一點。也許如果我變得更老,更聰明... – 2010-06-18 08:06:57

+0

@Malcolm:語言設計師的頭腦不是他正在閱讀的唯一東西... – 2010-06-18 15:07:05

1

我不知道最初的設計師最初是否有這種想法,但這對我來說意義重大。

因爲只能將該方法聲明爲void類型,所以它不能被覆蓋,也不能被作爲接口的一部分引用,編譯器可以簡單地忽略該方法,因爲如果指定模式沒有依賴關係比賽。如果另一個方法以非匹配模式調用它,編譯器可以簡單地將它視爲一個無效的方法調用,就好像該屬性不在那裏一樣。

約翰的示例將工作,但我會做這樣的事情:

#if DEBUG 
public static string TestStringForDebugOnly(...) 
{ 
    ... 
} 
#endif 

// Arguments are only for illustration. 
public string CallingMethod(int id, string temp) 
{ 

    #if DEBUG 
    string result = TestStringForDebugOnly(id, temp); 
    #else 
    string result = TestString(id, temp); 
    #endif 

    return result; 
} 

我會付出額外的努力來結束在預處理指令中的所有調試相關代碼(包括個體的方法調用)爲兩個原因。首先,它提供了自己的內置文檔;你確切知道什麼時候,地點和原因運行。其次,如果需要修改或刪除代碼,則需要進行的搜索量大大減少,同時需要重複編譯和重新編譯以查看哪些中斷。