Статические методы расширения в ASP.NET

#c# #asp.net

#c# #asp.net

Вопрос:

Я создал простой метод расширения, который преобразует любое число в новый, немного более короткий текст. Он делает это, используя 10 числовых значений ниже 10, а также символы алфавита.

Итак, вопрос в том, есть ли вызовы, которые обращаются к этому методу одновременно, будут ли коды char1 и char2 переопределены из сеанса одного пользователя сеансом другого пользователя

Вот код методов

  public static string Translate35(this int value)
    {   //O is just removed to avoid confusion between 0 and O
        string[] Enc = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

        int char1 = (value % Enc.Length);
        int char2 = (value / Enc.Length) % Enc.Length;
        int char3 = (int)(value / Math.Pow(Enc.Length, 2)) % Enc.Length;
        int char4 = (int)(value / Math.Pow(Enc.Length, 3)) % Enc.Length;
        int char5 = (int)(value / Math.Pow(Enc.Length, 4)) % Enc.Length;
        return Enc[char5]   Enc[char4]   Enc[char3]   Enc[char2]   Enc[char1];
    }

    public static int Translate35(this string value)
    {   //O is just removed to avoid confusion between 0 and O
        string[] Enc = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

        var indexEnc = Enc.Select((x, i) => new { charx = x, charindex = i }).ToDictionary(x => x.charx[0], x => x.charindex);

        int char0 = (int)(indexEnc[value[0]] * Math.Pow(Enc.Length, 4));
        int char1 = (int)(indexEnc[value[1]] * Math.Pow(Enc.Length, 3));
        int char2 = (int)(indexEnc[value[2]] * Math.Pow(Enc.Length, 2));
        int char3 = (int)(indexEnc[value[3]] * Math.Pow(Enc.Length, 1));
        int char4 = indexEnc[value[4]];
        return char4   char3   char2   char1   char0;
    }
  

Итак, чего я пытаюсь избежать, так это того, что этот метод манипулирует данными одного пользователя, и когда он попадает в

 int char3 = (int)(value / Math.Pow(Enc.Length, 2)) % Enc.Length;
  

тогда его char2 уже установлен.

затем другие пользовательские данные запускают тот же процесс и попадают в char2 и выполняются

 int char2 = (value / Enc.Length) % Enc.Length;
  

переопределяет ли это переменную first users или она сохраняется, потому что переменная char2 также не является статической.

Комментарии:

1. «Будет ли это иметь эффект, если 20000 пользователей вызовут метод в одно и то же или почти в одно и то же время». О каком эффекте вы спрашиваете?

2. Кодировка на базе 36 не нова. Хорошо, да, вы можете удалить O, если хотите, но почему бы также не удалить I и B, если шрифт неоднозначен? Не гадайте , будет ли что-то работать хорошо или не будет показывать другие проблемы. Если вам нужно знать, вам нужно установить цели , затем измерить это с помощью производительности и стресс-тестирования. Если ваша система не соответствует своим целям, тогда вы используете тестирование, чтобы изолировать то, что работает неприемлемо.

3. Вы спрашиваете, является ли код потокобезопасным?

4. Я не понимаю, о чем вы спрашиваете, но это выглядит довольно просто, и никаких проблем не возникнет, если несколько пользователей вызовут метод расширения. Хотя вы можете определить string[] Enc как статическое поле класса, а не как переменную внутри метода

5. @Damien_The_Unbeliever Я никогда не говорил, что это что-то новое. и I и B не являются проблемой в моем, печать только делает 0 и O одинаковыми.

Ответ №1:

Методы не имеют побочных эффектов. Они ничего не делают, кроме как принимают входные данные, обрабатывают их локально и возвращают выходные данные. Таким образом, нет проблем с большим количеством параллельных вызовов, потому что нет общих ресурсов, о которых нужно заботиться.

Если вы используете аннотации кода, вы могли бы использовать [Pure] атрибут либо из System.Diagnostics.Contracts.PureAttribute , либо JetBrains.Annotations.PureAttribute , если вы используете Resharper.

Вероятно, это можно было бы немного оптимизировать, переместив статические данные, доступные только для чтения, в свои собственные элементы.

Комментарии:

1. Что вы имеете в виду, говоря «методы не имеют побочных эффектов».

2. @PatrickHofman Они не получают доступа к членам класса, глобальным переменным или переменным среды или чему-либо подобному. Они получают входные данные, они возвращают значение. Вы могли бы назвать их «чистыми».

3. @PatrickHofman Хороший вопрос, хотя добавил немного больше объяснений к ответу, чтобы объяснить, что я имел в виду.

4. @nvoigt итак, поскольку мои переменные, созданные в методе, не являются статическими, каждый пользователь получает свой собственный экземпляр переменных и, следовательно, не влияет друг на друга?

5. @Neil правильно. Локальные переменные никогда не используются совместно между вызовами метода.