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;

它是覆盖第一个用户变量还是保存,因为变量 char2 也不是静态的。


慕斯王
浏览 66回答 1
1回答

蝴蝶不菲

这些方法没有副作用。他们什么都不做,只是接受输入,在本地处理并返回输出。所以很多并行调用没有问题,因为没有共享资源需要处理。如果您使用的是代码注释,则可以使用任一[Pure]属性,System.Diagnostics.Contracts.PureAttribute或者JetBrains.Annotations.PureAttribute如果您使用的是 Resharper。不过,可以通过将静态只读数据移动到它自己的成员来对其进行一些优化。
打开App,查看更多内容
随时随地看视频慕课网APP