c# - 线程安全的扩展方法?

标签 c# multithreading thread-safety extension-methods

我有一个非常简单的扩展方法,如下所示:

public static string ToUserPageTimeFormat(this DateTime TheTime)
{
    return TheTime.Month + "." + TheTime.Day + "." + TheTime.Year + "."  + TheTime.Hour + "." + TheTime.Minute;
}

我在一行中做到了。这保证是线程安全的吗?

最佳答案

是的,它是线程安全的。本质上,您的方法将拥有自己的 DateTime 参数的私有(private)副本,因为它由 value 传递 - 首先创建一个副本,然后将其交给该方法。此副本是该方法私有(private)的,对其他线程不可见 - 因此不可能被它们更改。

如果您使用了 ref 参数,则不会是这种情况:

// Not thread-safe.
public static string ToUserPageTimeFormat(ref DateTime TheTime){ ... }

在这样的假设场景中,参数可能在执行此方法的过程中在另一个线程上发生变化。 DateTime 是不可变类型这一事实在这种情况下无关紧要,因为它是一个结构,并且 a struct does not own its own storage .

例如,此方法可能会返回一个“不可能”的格式化日期,例如“2.31.2012.14.33”,这是由于多次写入操作中的“撕裂”读取造成的。

关于c# - 线程安全的扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8956667/

相关文章:

c++ - 这个函数是线程安全的吗?

java - "StringBuffer is synchronized (or thread-safe) and StringBuilder is not",为什么这会使 StringBuffer 方法变慢?

C# "lock"关键字 : Why is an object necessary for the syntax?

c# - 如何在 ASP.NET 上包含 libsodium.net

c# - 在 C# (web api) 中测试经过身份验证的方法(使用不记名 token )的正确方法

java - 线程中的某些代码不重复

c# - 将文本框绑定(bind)到属性类

c# - 找不到类型或命名空间名称 'FormatterContext' .net 4.5

c# - 为什么我不能使用 StateServer 在 2 个 Web 应用程序之间共享 session 状态?我错过了什么?

java - java中线程是如何执行的