具有out参数的静态方法是否安全?

时间:2016-06-09 14:22:46

标签: c# asp.net

基本上,我有一些类调用静态void来提供参数if ($bytes[0] == 0xef && $bytes[1] == 0xbb && $bytes[2] == 0xbf){

从我的理解,因为虚空有它自己的堆栈它是线程安全的,但是我不完全确定在使用输出时是否为真。有人可以澄清这个问题。谢谢!

$file_handler = fopen($pathname, "w");

2 个答案:

答案 0 :(得分:3)

您调用静态方法的方式,它不是线程安全的,因为它共享输出引用。但是如果从方法返回一个值并且该方法中正在创建该变量,则它可以是线程安全的。

static int MyMethod(int input)
{
    var output= 2;
    ...
    return output;
}

答案 1 :(得分:3)

来自MSDN文档:

  

out关键字导致参数通过引用传递。这与ref关键字类似,不同之处在于ref要求在传递变量之前对其进行初始化。要使用out参数,方法定义和调用方法都必须明确使用out关键字。

所以问题的答案取决于你如何调用静态方法。由于变量是通过引用传递的,如果你有多个线程调用你的方法并且它们传入相同的变量引用作为参数(即使这些参数是值类型,因为OUT导致通过引用显式传递),那么你的方法不是线程安全的。另一方面,如果多个线程调用您的方法,每个线程传入自己的变量引用,那么您的方法将是线程安全的。

这并非真正特定于OUT或REF修饰符。修改引用类型数据的任何方法本质上都不是线程安全的,您应该仔细考虑选择该路由的原因。通常,对于一个线程安全的方法,它应该是非常好的封装。