为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET 中的静态扩展方法

ASP.NET 中的静态扩展方法

C#
慕斯王 2022-10-23 15:30:52
我创建了一个简单的扩展方法,可以将任何数字转换为新的稍短的文本。它通过使用低于 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 也不是静态的。
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这些方法没有副作用。他们什么都不做,只是接受输入,在本地处理并返回输出。所以很多并行调用没有问题,因为没有共享资源需要处理。

如果您使用的是代码注释,则可以使用任一[Pure]属性,System.Diagnostics.Contracts.PureAttribute或者JetBrains.Annotations.PureAttribute如果您使用的是 Resharper。

不过,可以通过将静态只读数据移动到它自己的成员来对其进行一些优化。


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信