2010-05-12 10 views
0

J'ai lu this article, qui décrit comment les méthodes statiques et statiques sont appelées avec une regex .NET..NET Regex Instance Caching

Cependant, qu'en est-il si la variable elle-même est statique? Est-ce que quelqu'un sait si .NET fait une sorte de mise en cache qui pourrait potentiellement causer une fuite de mémoire?

Clarification. Par exemple:

public static Regex Foo = new Regex(@"(?:,.*)"); 

contre:

public static void MyMethod(){ 
    Regex Foo = new Regex(@"(?:,.*)"); 
} 

Est-ce l'une des personnes les plus susceptibles de causer des problèmes de mémoire que l'autre? Je sais que la seconde créera évidemment plus d'instances, mais que la première aura une sorte de mise en cache des chaînes entrantes à s'inquiéter, puisqu'elle restera essentiellement pour toujours.

+0

Que voulez-vous dire? – SLaks

+0

Mise à jour avec un exemple. – jvenema

Répondre

4

Si vous avez un objet Regex instancié et que vous n'appelez que des méthodes d'instance, la mise en cache (conformément à l'article fourni) n'aura pas lieu. Si vous créez l'objet Regex et que vous le stockez en tant que propriété statique dans votre classe, vous traitez toujours avec un objet instancié, par conséquent le cache ne se produira pas (> =. Net 2.0). Par contre, chaque fois que vous appelez des méthodes statiques Regex, telles que Regex.Match ("bla", "bla"), les expressions régulières analysées et compilées sont mises en cache.

EDIT

En regardant votre exemple, ne se produira pas tant que cache dans les deux cas. Si toutefois, le second exemple est:

Match m=Regex.Match(@"(?:,.*)",someString); 

... alors l'expression régulière compilée (?:,.*) seront mises en cache, afin que vous puissiez efficacement faire des appels ultérieurs à Regex.Match(@"(?:,.*)",... sans avoir besoin de réanalyser/recompiler l'expression (?:,.*). Je suppose qu'en termes de consommation de mémoire, cela équivaudrait presque exactement à conserver une instance statique. D'un autre côté, si l'expression régulière fournie à Regex.Match est modifiée, une entrée supplémentaire sera effectuée à certaines dépenses (probablement négligeables).

+0

Je ne suis pas confus, je sais exactement ce qui se passait; Je suis juste curieux de savoir s'il y a une mise en cache * du tout * qui se passe dans les instances d'un Regex. – jvenema

+0

enlevé, de peur de causer l'offense :) – spender

+0

Aucun pris :) Merci pour l'info. – jvenema

2

Il n'y a rien de tel qu'une "instance statique" - il n'y a que des variables statiques qui se réfèrent à des objets. Le même objet peut être référencé par une variable d'instance, une variable locale ou une variable statique. Il ne modifiera pas le code du constructeur Regex.

+0

OK, assez juste. Mauvaise formulation. La question a été mise à jour. Mais la question est toujours valide - si une instance donnée d'un Regex fait une sorte de mise en cache (c.-à-d., La mise en cache de la chaîne entrante passée à myRegex.Match ou une telle absurdité), alors cela ferait une différence. – jvenema