我有一个非常简单的扩展方法,如下所示:
public static string ToUserPageTimeFormat(this DateTime TheTime)
{
return TheTime.Month + "." + TheTime.Day + "." + TheTime.Year + "." + TheTime.Hour + "." + TheTime.Minute;
}
我在一行中做到了。这是否保证是线程安全的?
答案 0 :(得分:5)
是的,它是线程安全的。从本质上讲,您的方法将拥有自己的DateTime
参数的私有副本,因为它是由 value 传递的 - 首先创建一个副本然后传递给该方法。此副本对方法是私有的,对其他线程不可见 - 因此不可能被它们变异。
如果您使用了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”,这是由多次写入操作中的“撕裂”读取引起的。
答案 1 :(得分:2)
是的,DateTime
是一个结构,因此被复制到函数调用而不是仅传递引用。这是因为结构是值类型而不是引用类型。
答案 2 :(得分:1)
我认为没有理由说这不是线程安全的,据我所知,每个线程在其堆栈上都有一个Datetime对象,因此这里没有共享数据,因此不需要锁定。请参阅有关thread-safety
的维基百科页面