CultureInfo.CurrentCulture を null にすることはできますか?
null 値は私のプログラムをクラッシュさせますが、これは望ましくありません。だから私は尋ねている、安全のために、私はする必要がありますか?
var culture = CultureInfo.CurrentCulture ?? CultureInfo.InvariantCulture
CultureInfo.CurrentCulture を null にすることはできますか?
null 値は私のプログラムをクラッシュさせますが、これは望ましくありません。だから私は尋ねている、安全のために、私はする必要がありますか?
var culture = CultureInfo.CurrentCulture ?? CultureInfo.InvariantCulture
非であることが保証されているように見えますnull
:
カルチャは、実行中のスレッドのプロパティです。この読み取り専用プロパティは
CultureInfo
、プロパティによって返されるオブジェクトを取得することと同じThread.CurrentCulture
です。
Thread.CurrentCulture
に設定しようとすると例外がスローされるため、非値null
を持つことは不変であると想定するのが論理的です。null
これとは別にCultureInfo.CurrentCulture
、初期値を決定するアルゴリズムを示します。
スレッドのカルチャの決定方法
スレッドが開始されると、そのカルチャは最初に次のように決定されます。
DefaultThreadCurrentCulture
プロパティ値が ではない場合、スレッドが実行されているアプリケーション ドメインのプロパティによって指定されたカルチャを取得するnull
。Windows
GetUserDefaultLocaleName
関数を呼び出す。
null
繰り返しますが、これは値のオプションを開いたままにしません。
いいえ、null以外が保証されています。これは、その実装が (ILSpyを介して)System.Threading.Thread.CurrentCulture
直接返されるものです。CultureInfo.CurentCulture
// 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
したがって、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;
}
}
ご覧のとおり、それでもnullの場合はCultureInfo.InvariantCulture
返されます。
.NET ソースを見ると、誰かがそれを に設定しようとするとエラーがスローされnull
ますnull
。
/// <summary>Gets or sets the culture for the current thread.</summary>
/// <returns>A <see cref="T:System.Globalization.CultureInfo" /> representing the culture for the current thread.</returns>
/// <exception cref="T:System.NotSupportedException">The property is set to a neutral culture. Neutral cultures cannot be used in formatting and parsing and therefore cannot be set as the thread's current culture.</exception>
/// <exception cref="T:System.ArgumentNullException">The property is set to null.</exception>
/// <filterpriority>2</filterpriority>
/// <PermissionSet>
/// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="ControlThread" />
/// </PermissionSet>
[__DynamicallyInvokable]
public CultureInfo CurrentCulture
{
[__DynamicallyInvokable]
get
{
if (AppDomain.IsAppXModel())
{
return CultureInfo.GetCultureInfoForUserPreferredLanguageInAppX() ?? this.GetCurrentCultureNoAppX();
}
return this.GetCurrentCultureNoAppX();
}
[__DynamicallyInvokable, SecuritySafeCritical]
[SecurityPermission(SecurityAction.Demand, ControlThread = true)]
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
CultureInfo.nativeSetThreadLocale(value.SortName);
value.StartCrossDomainTracking();
this.m_CurrentCulture = value;
}
}