#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 правильно. Локальные переменные никогда не используются совместно между вызовами метода.