CultureInfo.CurrentCulture能否为空?

Col*_*nic 10 .net cultureinfo

CultureInfo.CurrentCulture能否为空?

null值会导致我的程序崩溃,这是我不想要的.所以我要问,为了安全,我需要做什么?

var culture = CultureInfo.CurrentCulture ?? CultureInfo.InvariantCulture
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 12

它看起来肯定是非保证null:

文化是执行线程的属性.此只读属性等效于检索CultureInfo属性返回的对象Thread.CurrentCulture.

Thread.CurrentCulture如果您尝试将其设置为null,则抛出异常,因此假设具有非null值是不变量是合乎逻辑的.

除此之外,CultureInfo.CurrentCulture给出确定其初始值的算法:

线程的文化是如何确定的

线程启动时,其文化初步确定如下:

  • 通过检索DefaultThreadCurrentCulture执行该线程的应用程序域中的属性指定的区域性,如果属性值不是,则检索该文化null.

  • 通过调用Windows GetUserDefaultLocaleName函数.

同样,这不会打开null值的选项.


Tim*_*ter 5

不,可以保证非空。这是System.Threading.Thread.CurrentCulture直接从CultureInfo.CurentCulture (通过ILSpy)返回的实现:

// System.Threading.Thread
public CultureInfo CurrentUICulture
{
    [SecuritySafeCritical]
    get
    {
        if (this.m_CurrentUICulture == null)
        {
            return CultureInfo.UserDefaultUICulture;
        }
        CultureInfo cultureInfo = null;
        if (!Thread.nativeGetSafeCulture(this, Thread.GetDomainID(), true, ref cultureInfo) || cultureInfo == null)
        {
            return CultureInfo.UserDefaultUICulture;
        }
        return cultureInfo;
    }
    // setter following
Run Code Online (Sandbox Code Playgroud)

因此,如果m_CurrentUICulture为null,它将返回UserDefaultUICulture

这是来源:

internal static CultureInfo UserDefaultUICulture
{
    get
    {
        CultureInfo cultureInfo = CultureInfo.s_userDefaultUICulture;
        if (cultureInfo == null)
        {
            CultureInfo.s_userDefaultUICulture = CultureInfo.InvariantCulture;
            cultureInfo = CultureInfo.InitUserDefaultUICulture();
            CultureInfo.s_userDefaultUICulture = cultureInfo;
        }
        return cultureInfo;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,即使是null CultureInfo.InvariantCulture也会被返回。