2011-03-28 32 views
5

昨晚我寫了我的第一個IHttpModule做一些請求處理。我使用正則表達式來檢查原始網址。 IHttpModule將在每個請求中被調用,因此對正則表達式對象進行某種緩存似乎是合理的,以防止在每個請求中創建它。什麼是更好的:通過HttpContext.Current.Cache緩存或只是一個靜態?

現在我的問題......有什麼更好的:使用HttpContext.Current.Cache來存儲實例化對象或在我的模塊中使用private static Regex

我很期待爲什麼。只是爲了澄清:正則表達式永遠不會改變,因此永遠是同一件事。

回答

11

如果正則表達式是不會改變的(而且通常是沒有),那麼:

private static readonly Regex pattern = new Regex("...", RegexOptions.Compiled); 

在各方面都

+0

但是如果進程重新啓動,那麼是否存在'pattern'爲null的風險? – Aliostad 2011-03-28 21:32:45

+3

@Aliostad - no。因爲它是該類的靜態屬性,所以當該類首次被引用時將被重新創建。 – tvanfosson 2011-03-28 21:33:40

+0

是的,你是對的。謝謝。實際上這個魔法是「只讀」的! – Aliostad 2011-03-28 21:35:10

3

我想這取決於最快和最有效的。內置緩存可以爲您提供自動過期控制,而靜態對象則無法實現。此外,如果您想更改緩存機制(假設您必須分發應用程序),則可以使用內置緩存。靜態對象就是它,靜態的。

+1

雖然是正確的,但對於一個簡單的正則表達式來說,這種擔心通常是過度的殺傷力 – 2011-03-28 21:34:30

+1

@Marc - 我會更進一步並且說它是代碼味道(投機性普遍性?) 。你已經創建了一個不需要存在的依賴關係,即什麼應該是靜態屬性,現在是不相關類中的數據。 – tvanfosson 2011-03-28 21:39:50

3

我會作爲一個規則使用靜態字段,並保存緩存爲您需要更多的控制對象的生命週期。這裏有兩方面的原因,我能想到的正前方:

  • 總是有涉及緩存對象並從緩存中檢索它的一些開銷,至少會有裝箱/拆箱
  • 你將不得不進入通過高速緩存鍵,而不是直接在代碼項目,這使得應用程序有點笨重,更難以瞭解

你應該問自己,如果你需要功能您可以通過緩存對象獲得,即壽命。

相關問題