C#静态扩展是否线程安全?

C#静态扩展是否线程安全?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我正在使用静态扩展将字符串转换为Sha256,如下所示: public static string ToSha256(this string value) { var message = Encoding.ASCII.GetBytes(value); SHA256Managed hashString = new SHA256Managed(); string hex = ""; var hashValue = ha

我正在使用静态扩展将字符串转换为Sha256,如下所示:

    public static string ToSha256(this string value)
    {
        var message = Encoding.ASCII.GetBytes(value);
        SHA256Managed hashString = new SHA256Managed();
        string hex = "";

        var hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }
注意static关键字。当两个线程同时进入并修改函数中的任何内部变量时,结果会受到影响吗


谢天谢地,在考虑代码是否为线程安全时,Static与此无关。静态只意味着方法及其数据不会在所有类实例中复制。您必须尝试想象,如果第二个线程在第一个线程仍然繁忙时进入,代码会发生什么情况。问问自己,当您忙于处理局部变量时,它们的数据会发生什么变化

假设线程1将输入您的方法,并在示例的第3行将字符串hex的值设置为空。然后进入for循环。当线程1仍在for循环中时,线程2进入并将十六进制字符串值设置回空。不好,先生

此代码不是线程安全的。您应该简单地对一些私有静态对象使用lock关键字

示例如下:

两个线程没有共享任何内容;另外,
是不可变的
字符串。所以,没问题。只有函数是静态的,而不是您在其中声明的变量(事实上,您不能在C#中这样做以避免此类问题),因此,尽管您对其他函数的调用是线程安全的,是的,它是线程安全的。可能的重复直接转到Eric的答案,不要通过goSo,你是说静电对线程安全有影响,不是吗?;)