c# - .NET 中系统程序集的 CultureName

标签 c# .net mono

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

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

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

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

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

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

为什么 .NET 会这样?我在 msdn 上找不到任何关于 AssemblyName 类中 CultureName 字段的默认值或一个含义的信息 空字符串。空字符串是否总是指“中性”区域性名称?

最佳答案

CultureName 属性是在 .Net 4.5 中引入的,具有中性文化的 Assembly 的该属性的值必须等于一个空字符串,例如名称不变文化,因为 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 */ }

关于c# - .NET 中系统程序集的 CultureName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937411/

相关文章:

c# - .Net 4.0 框架和 4.5 框架之间的区别?

c# - 在 C#/Mono 中通过 TLS/SSL 通过 Ftp 上传

C# - Azure 服务总线 - 在给定时间后取消消息处理

c# - 如何在调试期间检测字符串中的隐藏字符(例如零宽度空格)

.net - 扩展 WCF channel 以在失败时自动重新创建(/重新连接)自身

.net - 没有 LINQ 或其他 ORM 的存储库模式?

c# - 如何设置 monodoc 以与 transifex.com 一起使用?

c# - 在 NancyFx 上下文中获取 Windows 用户

c# - 提交后 ASP.Net MVC View 下拉列表未绑定(bind)到模型(发布)

c# - C#引用消耗多少内存?