在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 */ }