线程安全的扩展方法?

时间:2012-01-21 21:05:30

标签: c# multithreading thread-safety extension-methods

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

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

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

3 个答案:

答案 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

的维基百科页面