Безопасны ли статические расширения C #? - PullRequest
0 голосов
/ 27 мая 2018

Я использую статическое расширение для преобразования строки в 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.Что произойдет, если два потока одновременно начнут вносить изменения в любую из внутренних переменных функции, повлияет ли это на результат?

Спасибо

1 Ответ

0 голосов
/ 27 мая 2018

Статика не имеет никакого отношения, когда код считается поточно-ориентированным или нет.Только статический означает, что метод и его данные не реплицируются во всех экземплярах классов.Вы должны попытаться представить, что произойдет с вашим кодом, если второй поток войдет в то время, когда первый поток все еще занят.Спросите себя, что происходит с данными в ваших локальных переменных, когда вы заняты работой с ними.

Предположим, что поток 1 введет ваш метод, он устанавливает значение строки hex в пустое в строке 3 вашего образца.Затем он переходит к циклу for.Пока поток 1 все еще находится в цикле for, поток 2 входит и устанавливает значение шестнадцатеричной строки обратно пустым.Не хорошо, сэр!

Этот код не является потокобезопасным.Вы должны просто использовать ключевое слово lock против некоторого частного статического объекта.

Пример здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...