线程安全的扩展方法?

3

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

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

我在一行代码中实现了它。这个实现能保证线程安全吗?


我用一行代码完成了它。这是否保证是线程安全的?这是什么意思? - L.B
2
在编程中,“在一行上”并不意味着任何东西都是线程安全的。一个方法中的 x++ 操作本身并不是线程安全的。 - Oded
3个回答

6
是的,它是线程安全的。基本上,您的方法将拥有自己的私有副本DateTime参数,因为它是按值传递的 - 首先创建一个副本,然后交给该方法。这个副本对于该方法是私有的,其他线程看不到它 - 因此不可能被其他线程改变。
如果您使用了一个ref参数,情况将不会如此。
// Not thread-safe.
public static string ToUserPageTimeFormat(ref DateTime TheTime){ ... }

在这种假设的情况下,参数可能在执行此方法的过程中在另一个线程上发生变异。 DateTime是一个不可变类型在这种情况下是无关紧要的,因为它是一个结构体,并且结构体不拥有自己的存储

例如,这个方法可能会返回一个“不可能”的格式化日期,如“2.31.2012.14.33”,由于在多个写操作中间进行了“分裂”读取而导致。


正确答案,但 DateTime 是不可变的,因此“私有副本”不相关。 - H H
@Henk:你是在谈论答案的第二部分吗?你不同意它吗? - Ani
@Henk:基本上,如果我们通过引用传递,它是不可变的事实在它是值类型的情况下是无关紧要的 - 存储仍然可以是可变的。 - Ani

2

是的,DateTime 是一个结构体,因此它会被复制到函数调用中而不是仅传递引用。这是由于结构体是值类型而不是引用类型所导致的。


1

我认为这段代码是线程安全的,因为据我所知,每个线程都会在其堆栈上拥有一个Datetime对象,因此这里没有共享数据,也就不需要进行锁定。可以参考维基百科关于线程安全的页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接