Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET中的静态扩展方法_C#_Asp.net - Fatal编程技术网

C# ASP.NET中的静态扩展方法

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

我创建了一个简单的扩展方法,可以将任何数字转换为新的稍微短一点的文本。它通过使用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也不是静态的而保存。

这些方法没有副作用。他们什么也不做,只是接收输入,在本地处理并返回输出。因此,大量并行调用没有问题,因为没有共享资源需要处理

如果您使用的是代码注释,则可以使用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。局部变量永远不会在方法调用之间共享。