// Clear our internal caches internal static void ClearCachedData() { s_cachedCultures = null; s_cachedRegions = null; }
internal static CultureData GetCultureData(String cultureName, bool useUserOverride) { // First do a shortcut for Invariant if (String.IsNullOrEmpty(cultureName)) { return CultureData.Invariant; } // Try the hash table first String hashName = AnsiToLower(useUserOverride ? cultureName : cultureName + '*'); StringCultureDataDictionary tempHashTable = s_cachedCultures; if (tempHashTable == null) { // No table yet, make a new one tempHashTable = new StringCultureDataDictionary(); } else { // Check the hash table bool ret; CultureData retVal; lock (s_lock) { ret = tempHashTable.TryGetValue(hashName, out retVal); } if (ret && retVal != null) { return retVal; } } // Not found in the hash table, need to see if we can build one that works for us CultureData culture = CreateCultureData(cultureName, useUserOverride); if (culture == null) { return null; } // Found one, add it to the cache lock (s_lock) { tempHashTable[hashName] = culture; } // Copy the hashtable to the corresponding member variables. This will potentially overwrite // new tables simultaneously created by a new thread, but maximizes thread safety. s_cachedCultures = tempHashTable; return culture; }
internal static CultureData GetCultureDataForRegion(String cultureName, bool useUserOverride) { // First do a shortcut for Invariant if (String.IsNullOrEmpty(cultureName)) { return CultureData.Invariant; } // // First check if GetCultureData() can find it (ie: its a real culture) // CultureData retVal = GetCultureData(cultureName, useUserOverride); if (retVal != null && (retVal.IsNeutralCulture == false)) return retVal; // // Not a specific culture, perhaps it's region-only name // (Remember this isn't a core clr path where that's not supported) // // If it was neutral remember that so that RegionInfo() can throw the right exception CultureData neutral = retVal; // Try the hash table next String hashName = AnsiToLower(useUserOverride ? cultureName : cultureName + '*'); StringCultureDataDictionary tempHashTable = s_cachedRegions; if (tempHashTable == null) { // No table yet, make a new one tempHashTable = new StringCultureDataDictionary(); } else { // Check the hash table lock (s_lock) { tempHashTable.TryGetValue(hashName, out retVal); } if (retVal != null) { return retVal; } } // // Not found in the hash table, look it up the hard way // // If not a valid mapping from the registry we'll have to try the hard coded table if (retVal == null || (retVal.IsNeutralCulture == true)) { // Not a valid mapping, try the hard coded table string name; if (RegionNames.TryGetValue(cultureName, out name)) { // Make sure we can get culture data for it retVal = GetCultureData(name, useUserOverride); } } // If not found in the hard coded table we'll have to find a culture that works for us if (retVal == null || (retVal.IsNeutralCulture == true)) { retVal = GetCultureDataFromRegionName(cultureName); } // If we found one we can use, then cache it for next time if (retVal != null && (retVal.IsNeutralCulture == false)) { // first add it to the cache lock (s_lock) { tempHashTable[hashName] = retVal; } // Copy the hashtable to the corresponding member variables. This will potentially overwrite // new tables simultaneously created by a new thread, but maximizes thread safety. s_cachedRegions = tempHashTable; } else { // Unable to find a matching culture/region, return null or neutral // (regionInfo throws a more specific exception on neutrals) retVal = neutral; } // Return the found culture to use, null, or the neutral culture. return retVal; }