2011-03-28 57 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

我会作为一个规则使用静态字段,并保存缓存为您需要更多的控制对象的生命周期。这里有两方面的原因,我能想到的正前方:

  • 总是有涉及缓存对象并从缓存中检索它的一些开销,至少会有装箱/拆箱
  • 你将不得不进入通过高速缓存键,而不是直接在代码项目,这使得应用程序有点笨重,更难以了解

你应该问自己,如果你需要功能您可以通过缓存对象获得,即寿命。

相关问题