我创建了一个简单的扩展方法,该方法可以将任何数字转换为稍短的新文本。它通过使用低于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;
它会覆盖第一个用户变量还是保存它,因为变量char2也不是静态的。
答案 0 :(得分:2)
该方法没有副作用。他们什么也不做,只能接受输入,在本地处理并返回输出。因此,由于没有共享资源需要照顾,因此许多并行调用没有问题。
如果您使用的是代码注释,则在使用Resharper时,可以使用[Pure]
或System.Diagnostics.Contracts.PureAttribute
中的JetBrains.Annotations.PureAttribute
属性。
不过,可以通过将静态只读数据移动到其自身成员中来对其进行一些优化。