C# CultureInfo.CreateSpecificCulture()与类的构造函数之间的差异?

C# CultureInfo.CreateSpecificCulture()与类的构造函数之间的差异?,c#,.net-3.5,globalization,cultureinfo,C#,.net 3.5,Globalization,Cultureinfo,类CultureInfo提供了两种创建方法: 通过a 经由 MSDN文档对这两个方面略有不同,为构造函数提到了一些“Windows文化”。但这真的重要吗 我应该选择其中一个而不是另一个吗? 注意:如果有必要的话,我正在使用.NET 3.5版,我想这样使用它: Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture); Thread.CurrentThread.CurrentUICultur

CultureInfo
提供了两种创建方法:

  • 通过a
  • 经由
MSDN文档对这两个方面略有不同,为构造函数提到了一些“Windows文化”。但这真的重要吗

我应该选择其中一个而不是另一个吗?

注意:如果有必要的话,我正在使用.NET 3.5版,我想这样使用它:

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

正如

工厂方法在无法创建区域性信息时有一个回退

因此,如果使用特定区域性(如“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);
}
publicstaticcultureinfo CreateSpecificCulture(字符串名称)
{
文化信息;
尝试
{
info=新文化信息(名称);
}
捕获(异常)
{
info=null;
for(int i=0;i

因此,我更喜欢工厂方法。

这个线程已经得到了回答,但我遇到了CreateSpecificCulture API的一个独特发现,这个发现有时可能并不那么明显。所以我认为这条线索是我发现的合适地方。我花了几天的时间在这上面,所以我只想分享我的经验,如果它能为其他人节省几个小时或几天

当使用API时,仅传递区域性名称,如
pt
(葡萄牙语)或
de
(德语),此API将返回与区域设置相对应的特定区域性,该区域设置被称为该区域性的默认区域设置。现在这个地方可能不像听起来那么明显,我被卡住了。对于德语,
de
看起来很明显,这是德语在德国的口语。对于意大利语,
它看起来很明显,在意大利说的是意大利语

同样地,
pt
对于在葡萄牙说葡萄牙语的人来说也很明显。不幸的是,情况并非如此。基于不确定确切原因(可能是人口、原籍国、国家语言等),当您尝试从区域性id创建特定区域性时(在本例中为
pt
),会根据全球标准化来确定给定区域性的默认区域设置。Microsoft已在以下链接中记录了整个列表:

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

对于葡萄牙语,固定文化“葡萄牙语”的语言名称缩写与“葡萄牙语(巴西)”匹配,即PTB。葡萄牙语(葡萄牙)有不同的代码
PTG
。因此,在本例中,葡萄牙语(巴西)是葡萄牙语的默认语言环境。

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


我仍在寻找原因,尽管这是将特定国家设置为任何文化的默认语言环境的背后的因素,在葡萄牙语的情况下,这听起来不那么明显。欢迎提供任何信息或意见

工厂方法和构造函数之间还有另一个明显的区别:构造函数提供了一个额外的可选布尔值,其默认值设置为true

如果确实需要>“普通”de de
),您将始终获得区域性设置,该设置可能具有意外设置,具体取决于用户如何通过控制面板更改此区域性

工厂方法不支持此布尔值

关于您希望布尔值何时为的最后两个想法:

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

你说得对,正如我自己的测试所示,工厂方法可以处理这一问题。然而,回退只适用于区域部分,错误的中性文化不由这两个部分中的任何一个处理。我现在使用建议的工厂方法。我已经对所有相关的区域性进行了单元测试,它是有效的。我注意到for
CreateSpecificCulture(“en”)
返回en-us,而
new CultureInfo(“en”)
似乎返回一个不变量English@DirkBoer这是对的。这个答案不包括两种文化的事实,即中性文化(如
en
)和特定文化(如
en-US
en-GB
en-AU
)。检查属性
IsNeutralCulture
以找到答案。请注意,在这个答案引用的源代码中,在
try
-
catch
结构之后,我们