首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CultureInfo.CurrentCulture与Thread.CurrentThread.CurrentCulture的区别

CultureInfo.CurrentCulture与Thread.CurrentThread.CurrentCulture的区别
EN

Stack Overflow用户
提问于 2022-11-19 19:18:34
回答 1查看 42关注 0票数 1

因此,我做了一些测试,在这些测试中,我需要触发一些线程,并执行一些修改CurrentCulture的日期时间部分,并且想知道CultureInfo.CurrentCultureThread.CurrentThread.CurrentCulture之间是否有任何区别。

对于两个intellisense都告诉我:

代码语言:javascript
复制
Gets or sets the culture for the current thread.
Returns:
An object that represents the culture for the current thread.

我的代码:

代码语言:javascript
复制
using System.Globalization;

Console.WriteLine("Hello, World!");
string dateValueString = "05/07/2022";

CultureInfo enGB = new CultureInfo("en-GB");
CultureInfo enUS = new CultureInfo("en-US");

DateTime result = DateTime.Now;
DateTime result2 = DateTime.Now;

Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}");
if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result))
{
    Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}");
    result2 = DateTime.Parse(dateValueString);
    Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}");
}
Console.WriteLine(System.Environment.NewLine);

Thread.CurrentThread.CurrentCulture = enGB;
Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}");
if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result))
{
    Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}");
    result2 = DateTime.Parse(dateValueString);
    Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}");
}
Console.WriteLine(System.Environment.NewLine);

Thread.CurrentThread.CurrentCulture = enUS;
Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}");
if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result))
{
    Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}");
    result2 = DateTime.Parse(dateValueString);
    Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}");
}
Console.WriteLine(System.Environment.NewLine);

new Thread(() =>
{
    Thread.CurrentThread.CurrentCulture = enGB;
    Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}");
    if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result))
    {
        Console.WriteLine($"[Thread] Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}");
        result2 = DateTime.Parse(dateValueString);
        Console.WriteLine($"[Thread][Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}");

    }
}).Start();
Console.WriteLine(System.Environment.NewLine);

输出:

代码语言:javascript
复制
CurrentCulture: es-ES - ThreadCulture: es-ES
Original: 05/07/2022 Parsed: 05/07/2022 0:00:00. Day: 5. Month: 7. Year: 2022
[Parse]Original: 05/07/2022 Parsed: 05/07/2022 0:00:00. Day: 5. Month: 7. Year: 2022


CurrentCulture: en-GB - ThreadCulture: en-GB
Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022
[Parse]Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022


CurrentCulture: en-US - ThreadCulture: en-US
Original: 05/07/2022 Parsed: 7/5/2022 12:00:00 AM. Day: 5. Month: 7. Year: 2022
[Parse]Original: 05/07/2022 Parsed: 5/7/2022 12:00:00 AM. Day: 7. Month: 5. Year: 2022



CurrentCulture: en-GB - ThreadCulture: en-GB
[Thread] Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022
[Thread][Parse]Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 23:09:51

CultureInfo.CurrentCultureThread.CurrentThread.CurrentCulture的区别

令人惊讶的是,以前没有人问过这个问题。,尽管人们已经开始询问Application.CurrentCulture了。

无论如何:Thread.CurrentThread.CurrentCulture (或特定的Thread.CurrentCulture )的属性getter只返回CultureInfo.CurrentCulture从源代码中可以看到

代码语言:javascript
复制
class Thread
{
    // ...

    public CultureInfo CurrentCulture
    {
        get
        {
            RequireCurrentThread();
            return CultureInfo.CurrentCulture;
        }
        set
        {
            if (this != CurrentThread)
            {
                SetCultureOnUnstartedThread(value, uiCulture: false);
                return;
            }
            CultureInfo.CurrentCulture = value;
        }
    }

    // ...
}

因此,就您而言:没有差别,您的测试也是多余的。

如果您想知道,CultureInfo.CurrentCulture是一个简单的属性,它可以读写到字段 (因此真正的逻辑在CLR中,我想是这样的):

代码语言:javascript
复制
public partial class CultureInfo : IFormatProvider, ICloneable
{
    // ...
   
    [ThreadStatic]
    private static CultureInfo? s_currentThreadCulture;

    [ThreadStatic]
    private static CultureInfo? s_currentThreadUICulture;

    // ...

    public static CultureInfo CurrentCulture
    {
        get
        {
            return s_currentThreadCulture ??
                s_DefaultThreadCurrentCulture ??
                s_userDefaultCulture ??
                InitializeUserDefaultCulture();
        }
        set
        {
            ArgumentNullException.ThrowIfNull(value);

            if (s_asyncLocalCurrentCulture == null)
            {
                Interlocked.CompareExchange(ref s_asyncLocalCurrentCulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentCulture), null);
            }
            s_asyncLocalCurrentCulture!.Value = value;
        }
    }

    // ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74502958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档