代码之家  ›  专栏  ›  技术社区  ›  lockedscope L42

CultureInfo线程安全

  •  11
  • lockedscope L42  · 技术社区  · 14 年前

    所以,我不想每次调用解析函数时都创建EngCulture。目前我正在传递EngCulture作为一个参数,但我对此不满意。 我想将EngCulture定义为一个静态成员,以便线程共享它。

    Msdn文档说“任何这种类型的公共静态(在visualbasic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全。” 我只是在使用下面的函数,那么我怎么知道TryParse是否使用EngCulture的任何实例成员呢?

    public static CultureInfo EngCulture = new CultureInfo("en-US", false);
    
    void parser()
    {
        if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))...
    }
    
    5 回复  |  直到 14 年前
        1
  •  6
  •   abatishchev Karl Johan    14 年前

    CultureInfo.GetCultureInfo("en-US") “使用指定的区域性名称检索区域性的缓存只读实例。”

    http://msdn.microsoft.com/en-us/library/yck8b540.aspx

    或者将字段设置为只读,这样就不需要锁定:

    private static CultureInfo _culture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
    
        2
  •  3
  •   Dirk Vollmar    14 年前

    CultureInfo.ReadOnly 方法:

    public static CultureInfo EngCulture = CultureInfo.ReadOnly(
        new CultureInfo("en-US", false));
    
        3
  •  1
  •   codymanix    14 年前

    System.Threading.Thread.CurrentThread.CurrentCulture = myCI; 所以不必每次调用函数时都传递它。

        4
  •  0
  •   Kieren Johnstone    14 年前

    “成员”是指方法加运算符加字段加属性。您使用的是实例成员,因此应该使用 lock

    希望有帮助!

        5
  •  0
  •   AakashM    14 年前

    两点:

    我不想每次调用解析函数时都创建EngCulture

    CultureInfo 不会特别大,至于性能,内置的实际上是缓存的,所以所有的 new

    我怎么知道TryParse是否使用EngCulture的任何实例成员?

    如果我发现一种方法 认可的 然后继续 改变 无论如何。尽管它们在形式上并不是不可变的,但我会毫不犹豫地使用它们(尤其是“内置”的),就好像它们是不可变的一样。

    所以,我会说有一个静态 new CultureInfo("en-US", false)