2008-10-01 61 views
6

在VB.Net C#的功能,我可以在一個函數作爲靜態聲明變量,像這樣:與靜態數據

Function EncodeForXml(ByVal data As String) As String 
    Static badAmpersand As Regex = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)") 

    data = badAmpersand.Replace(data, "&") 

    ''// more processing 

    return data 
End Function 

注意,我需要使用關鍵字Static,而不是Shared,這是在VB.Net中表達這種常用方法。我怎樣才能在C#中做到這一點?我無法找到它的等價物。

回答

13

哈!在發佈這個問題時,我找到了答案!我應該一直在尋找有關VB.Net如何實現它的細節,而不是將其用於C#的搜索,並且輸入對我來說很明顯的問題。應用該洞察之後,我發現這一點:
http://weblogs.asp.net/psteele/articles/7717.aspx

那篇文章解釋說,這不是真的由CLR支持和VB編譯器創建一個靜態(共享)變量的方法的類「引擎蓋下」。要在C#中執行相同的操作,我必須自己創建變量。

不僅如此,它還使用Monitor類來確保靜態成員也是線程安全的。尼斯。

附註:我希望很快能夠在C#中看到這一點。我從MS觀察到的一般策略是,它不喜歡VB.Net和C#在功能上分得太遠。如果一種語言具有不被另一種語言支持的功能,則它傾向於成爲下一個版本的語言團隊的優先事項。

+0

想想看,我要皮條客我自己的博客(在我這幾個月前處理)...但是你已經保存我的麻煩,而且這個入口比我自己明顯得多。感謝您的鏈接! – 2008-10-01 14:15:45

+0

你也可以查看使用反射器從VB生成的IL/C#代碼,我注意到前一段時間。查看一些VB技巧是否可以在C#中完成也很有趣。 – faulty 2008-10-02 04:32:20

4

不幸的是,在C#中沒有等價物。

您將需要使用一個類級別的變量。

這是VB希望C#的少數幾件事之一。

6

我個人很高興C#沒有有這個。邏輯上,方法沒有狀態:類型和實例。 C#使該邏輯模型更清晰,IMO。

+0

同意用這種方法用方法保存狀態是一個壞主意。請注意,在這種情況下,目的是確保創建/編譯正則表達式只發生一次。你可以說這是一種狀態,但我認爲這是關於性能,而不是在方法調用之間保存數據。 – 2008-10-01 14:02:23

1

您必須聲明這在類級別:

private static readonly RegEx badAmpersand = new RegEx("...");