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

时间:2012-08-30 09:35:03

标签: c# .net-3.5 globalization cultureinfo

班级CultureInfo提供两种创作方式:

MSDN文档对于两者略有不同,提到了构造函数的一些“Windows文化”。但这真的很重要吗?

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

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

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

described in this answer.

3 个答案:

答案 0 :(得分:28)

如果无法创建文化信息,工厂方法会有后备。

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

低于工厂方法的source

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);
}

所以我更喜欢工厂方法。

答案 1 :(得分:5)

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

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

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

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

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

对于葡萄牙语,不变文化的语言名称缩写&#34;葡萄牙语&#34;与&#34;葡萄牙语(巴西)&#34;匹配这是PTB。葡萄牙语(葡萄牙)有不同的代码PTG。所以在这种情况下,葡萄牙语(巴西)是葡萄牙语的默认语言环境。

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

我仍然在寻找原因,但 因素将设置一个特定国家作为任何文化的默认语言环境,而葡萄牙语的情况并非如此明显。欢迎任何信息或评论。

答案 2 :(得分:1)

factory-method和contructor之间还有另一个显着的区别:构造函数提供了一个额外的可选boolean,默认设置为true。

如果你真的需要一个&gt;“plain”&lt;你需要将这个布尔设置为false。 cultureinfo,因为: 如果您要求特定的文化(例如de-DE)而没有“布尔值设置为false”,您将始终获得文化设置,这可能会有意外的设置,具体取决于用户如何通过Control-更改此文化面板。

factory-method不支持此布尔值!!!

关于何时需要此布尔值的最后两个想法是:

  • true:您正在为您生成输出UI - 此输出应根据用户通过Control-Panel选择的特定文化设置
  • false:您想要解析数据(例如来自XML),并且您知道特定的XML文化设置(例如,小数分隔符为逗号)。在这种情况下,您需要plain de-DE - 文化以确保,特殊的控制面板设置不会干扰。