CultureInfo.CreateSpecificCulture()与类的构造函数之间的区别?

Mar*_*cel 30 c# globalization cultureinfo .net-3.5

该类CultureInfo提供了两种创建方式:

MSDN文档确实略有不同,提到构造函数的一些"Windows文化".但这真的很重要吗?

我应该更喜欢两个中的一个吗?

注意:如果重要的话,我使用的是.NET 3.5版本,我想这样使用它:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
Run Code Online (Sandbox Code Playgroud)

本答案所述.

Erw*_*win 28

无法创建文化信息时,工厂方法具有后备.

因此,如果您使用像'en-XX'这样的特定文化,则无法创建文化信息实例,将抛出异常并使用中性文化'en'重试将成功.

下面是工厂方法的来源

public static CultureInfo CreateSpecificCulture(string name)
{
    CultureInfo info;
    try
    {
        info = new CultureInfo(name);
    }
    catch (ArgumentException)
    {
        info = null;
        for (int i = 0; i < name.Length; i++)
        {
            if ('-' == name[i])
            {
                try
                {
                    info = new CultureInfo(name.Substring(0, i));
                    break;
                }
                catch (ArgumentException)
                {
                    throw;
                }
            }
        }
        if (info == null)
        {
            throw;
        }
    }
    if (!info.IsNeutralCulture)
    {
        return info;
    }
    return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}
Run Code Online (Sandbox Code Playgroud)

所以我更喜欢工厂方法.

  • 你是对的,工厂方法可以处理,正如我自己的测试所示.然而,后备只适用于区域部分,错误的中性文化不会被两者中的任何一个处理. (2认同)
  • 我注意到,对于`CreateSpecificCulture(“ en”)`返回en-us,而`new CultureInfo(“ en”)`似乎返回不变的英语 (2认同)
  • @DirkBoer 是对的。这个答案没有涵盖以下事实:存在两种文化,__中性__文化(如“en”)和__特定__文化(如“en-US”或“en-GB”或“en-AU”)。检查属性“IsNeutralCulture”来找出答案。请注意,在这个答案引用的源代码中,在“try”-“catch”结构之后,我们检查它是否是中性文化,如果是这种情况,我们会从“内部”创建特定的_另一种_文化内部成员字段上的属性“SSPECIFICCULTURE”。有关示例,请参阅[我在其他地方的帖子](http://stackoverflow.com/a/41940504/1336654)。 (2认同)
  • 因此,如果你想要一个中性或特定的文化(包括特殊的"不变文化"),请使用"new CultureInfo(culture)",具体取决于字符串参数.如果你想避免中性文化,可以使用`CultureInfo.CreateSpecificCulture(culture)`. (2认同)

RBT*_*RBT 7

这个线程得到了回答,但我遇到了CreateSpecificCulture API的一个独特发现,有时可能不那么明显.所以我认为这个帖子对我的发现很合适.我花了几天时间考虑分享我的经验,如果它可以为其他人节省几个小时或几天.

在传递API时,只使用文化名称pt(对于葡萄牙语)或de(对于德语),此API将返回与区域设置相对应的特定区域性,该区域性称为该区域性的默认区域设置.现在这个地方可能不会那么明显,就像我被困住的地方一样.对于德国人来说,在德国de-DE看起来很明显.对于意大利人来说,意大利的意大利语it-IT很明显.

pt-PT对于葡萄牙人来说,同样看起来很明显.不幸的是情况并非如此.基于不确定究竟是什么原因(可能是人口,原籍国,国家语言等),有一个全球标准化,当您尝试从文化ID创建特定文化时,将根据该标准化确定给定文化的默认区域设置. (pt在这种情况下).Microsoft已在以下链接中记录了整个列表:

http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

如果您想知道哪个是给定文化或语言的默认国家/地区语言环境,只需匹配上述链接中的最后一列(语言名称缩写)代码.

对于葡萄牙语,不变文化"葡萄牙语"的语言名称缩写与作为PTB的"葡萄牙语(巴西)"匹配.葡萄牙语(葡萄牙)有不同的代码PTG.因此,在这种情况下,葡萄牙语(巴西)是葡萄牙语的默认语言环境.

如果您的应用程序逻辑或要求以任何方式依赖于此API的此行为,则必须谨慎.这种行为在基于Web的应用程序中变得更加重要,因为市场中的所有浏览器也遵循这些准则,并在您查看多语言网站的本地化版本时在http请求标头中发送适当的信息.

我仍然在寻找原因,但这背后因素是将特定国家设置为任何文化的默认语言环境,这在葡萄牙语中并不那么明显.欢迎任何信息或评论.