我有一个非常简单的扩展方法,代码如下:
public static string ToUserPageTimeFormat(this DateTime TheTime)
{
return TheTime.Month + "." + TheTime.Day + "." + TheTime.Year + "." + TheTime.Hour + "." + TheTime.Minute;
}
我在一行代码中实现了它。这个实现能保证线程安全吗?
我有一个非常简单的扩展方法,代码如下:
public static string ToUserPageTimeFormat(this DateTime TheTime)
{
return TheTime.Month + "." + TheTime.Day + "." + TheTime.Year + "." + TheTime.Hour + "." + TheTime.Minute;
}
我在一行代码中实现了它。这个实现能保证线程安全吗?
DateTime
参数,因为它是按值传递的 - 首先创建一个副本,然后交给该方法。这个副本对于该方法是私有的,其他线程看不到它 - 因此不可能被其他线程改变。ref
参数,情况将不会如此。// Not thread-safe.
public static string ToUserPageTimeFormat(ref DateTime TheTime){ ... }
DateTime
是一个不可变类型在这种情况下是无关紧要的,因为它是一个结构体,并且结构体不拥有自己的存储。
例如,这个方法可能会返回一个“不可能”的格式化日期,如“2.31.2012.14.33”,由于在多个写操作中间进行了“分裂”读取而导致。
是的,DateTime
是一个结构体,因此它会被复制到函数调用中而不是仅传递引用。这是由于结构体是值类型而不是引用类型所导致的。
我认为这段代码是线程安全的,因为据我所知,每个线程都会在其堆栈上拥有一个Datetime对象,因此这里没有共享数据,也就不需要进行锁定。可以参考维基百科关于线程安全的页面。
x++
操作本身并不是线程安全的。 - Oded