Troy,

> Greco Giuseppe wrote:
> > There are also performance issues; actually, the code
> > for getting a localized string is as following:
> > 
> > public static string GetString(string name, CultureInfo culture)
> > {
> >   if (resourceManager == null) {
> >     lock (typeof(ResourceUtils)) {
> >       if (resourceManager == null) {
> >         Assembly assembly = Assembly.GetCallingAssembly();
> >         resourceManager = new ResourceManager(
> >           assembly.GetName().Name, assembly);
> >       }
> >     }
> >   }
> > 
> >   return resourceManager.GetString(name, culture);
> > }
> > 
> > In the code above, the lock takes place only once (the first
> > time a string is retrieved), assuring good performance.
> 
> In the code above, there are unfortunately also correctness issues.
> 
> Ref:
> http://weblogs.asp.net/oldnewthing/archive/2004/05/28/143769.aspx
> http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
> 
> The article on this page seems to imply that DCL is fixed in .Net,
but 
> they still recommend using simple static initialisation.
> http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dnbda/html/singletondespatt.asp
> 

On .NET the code above just works fine. What's important is to define
resourceManager as following:

private static volatile ResourceManager resourceManager;

Honestly, the only thing I forgot in the original source code was
the "volatile" keyword.

> > Adding the functionality to register additional assemblies,
> > the lock would take place always as demonstrated in the following
> > code chunk:
> > 
> > static ResourceUtils()
> > {
> >   resourceManagerDictionary = new ResourceManagerDictionary();
> > }
> > 
> > public static void RegisterAssembly(Assembly assembly)
> > {
> >   lock (resourceManagerDictionary) {
> >     resourceManagerDictionary.Add(assembly.GetName().Name,
> >       new ResourceManager(assembly.GetName().Name, assembly))
> >   }
> > }
> > 
> > public static string GetString(string name, CultureInfo culture)
> > {
> >   string localizedString = null;
> >   ResourceManager resourceManager = null;
> > 
> >   lock (resourceManagerDictionary) {
> >     foreach (DictionaryEntry entry in resourceManagerDictionary) {
> >       resourceManager = entry.Value as ResourceManager;
> >       localizedString = resourceManager.GetString(name, culture);
> > 
> >       if (localizedString != null) {
> >         break;
> >       }
> >     }
> >   }
> > 
> >   return localizedString;
> > }
> > 
> > The methods RegisterAssembly() and GetString() must be kept
> > synchronized...
> > 
> > What do you think about?
> 
> Why doesn't GetString in this section restrict itself to the 
> ResourceManager for the calling assembly?

Different NAnt assemblies could use the same error/warning
messages and maintaining them consistent might be a hell.

> 
> 
> On an unrelated note, is there any reason you use a static
initialiser 
> block instead of inline initialisation of your static member?

You are right, I could use an inline initialization as well,
but I prefer the static initializer... it's just a style sake.

j3d.

> 
> 
> Regards,
> 
> -- Troy
> 
> 
> -------------------------------------------------------
> SF email is sponsored by - The IT Product Guide
> Read honest & candid reviews on hundreds of IT Products from real
users.
> Discover which products truly live up to the hype. Start reading now.
> http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
> _______________________________________________
> nant-developers mailing list
> nant-developers@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/nant-developers
-- 
----------------------------------------
Giuseppe Greco

::agamura::

phone:  +41 (0)91 604 67 65
mobile: +41 (0)79 602 99 27
email:  [EMAIL PROTECTED]
web:    www.agamura.com
----------------------------------------





-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
nant-developers mailing list
nant-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nant-developers

Reply via email to