c# – .NET中System Collection的CultureName

在C#中编写一些代码处理程序集时,我注意到Assembly对象的字段值不一致(系统程序集的示例):

> typeof(string).Assembly.FullName
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

但是直接访问AssemblyName对象的CultureName字段时,其值为空字符串:

> typeof(string).Assembly.GetName().CultureName
""

当我在Linux(单声道3.99)上运行相同的测试时,我得到了另一个结果:

> typeof(string).Assembly.GetName().CultureName
"neutral"

为什么.NET的行为方式如此?我在msdn上找不到关于AssemblyName类中的CultureName字段的默认值或者含义的任何信息
空字符串.空字符串总是指“中性”文化名称吗?

最佳答案 CultureName属性是在.Net 4.5中引入的,具有中性文化的程序集的属性值必须等于空字符串,如不变文化的名称,因为CultureName使用了CultureInfo属性(
source):

public String CultureName
{
    get
    {
        return (_CultureInfo == null) ? null : _CultureInfo.Name;
    }
}

但在Mono中,CultureName属性具有不同的实现(source).为什么不同?我认为Mono的开发人员知道答案.

public string CultureName { 
    get { 
        if (cultureinfo == null) 
            return null; 
        if (cultureinfo.LCID == CultureInfo.InvariantCulture.LCID) 
            return "neutral"; 
        return cultureinfo.Name; 
    } 
} 

因此,如果要检查AssemblyName是否具有中性文化,请使用以下代码:

if (object.Equals(assemblyName.CultureInfo, CultureInfo.InvariantCulture))
{ /* neutral culture */ }
点赞