C# ASP.NET中的静态扩展方法
我创建了一个简单的扩展方法,可以将任何数字转换为新的稍微短一点的文本。它通过使用10以下的10个数值以及字母字符来实现这一点 所以问题是,如果有同时访问此方法的调用,那么代码char1和char2是否会从一个用户的会话被另一个用户的会话覆盖 下面是这些方法的代码C# 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
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也不是静态的而保存。这些方法没有副作用。他们什么也不做,只是接收输入,在本地处理并返回输出。因此,大量并行调用没有问题,因为没有共享资源需要处理 如果您使用的是代码注释,则可以使用System.Diagnostics.Contracts.PureAttribute或JetBrains.annotations.PureAttribute中的[Pure]属性(如果您使用的是Resharper)
不过,通过将静态只读数据移动到自己的成员,它可能会得到一些优化。如果20000个用户同时或接近同时调用该方法,它会有效果吗。你在问什么样的影响?这并不新鲜。好的,是的,如果你喜欢,你可以删除O,但是如果字体不明确,为什么不删除I和B呢?不要猜测某件事情是否会表现良好,或出现其他问题。如果你需要知道,你需要设定目标,然后通过绩效和压力测试来衡量。如果您的系统没有达到其目标,那么您可以使用测试来隔离不可接受的部分。您是否询问代码是否是线程安全的?我不明白您的要求,但这看起来非常简单,并且多个用户调用扩展方法不会产生任何问题。尽管您可以将字符串[]Enc定义为类的静态字段,而不是类内部的变量method@Damien_The_Unbeliever我从没说过这是新的。I和B在我的中不是问题,打印只会使0和O看起来一样。你说这些方法没有副作用是什么意思。@Patrickhoffman他们不访问类成员、全局变量或环境变量或类似的东西。它们得到输入,然后返回一个值。你可以说它们是纯的。@Patrickhoffman问得好,在回答中添加了一点解释来解释我的意思。@nvoigt因为我在方法中创建的变量不是静态的,所以每个用户都有自己的变量实例,因此不会相互影响?@Neil correct。局部变量永远不会在方法调用之间共享。