我的静态C#功能正在和我一起玩游戏......总觉得很奇怪!

Cod*_*ang 6 c# debugging asp.net-mvc-3

所以,我写了一个小的,从我最初的想法,在C#中简单的方法.此静态方法旨在用作简单的密码建议生成器,代码如下所示:

public static string CreateRandomPassword(int outputLength, string source = "")
{
  var output = string.Empty;

  for (var i = 0; i < outputLength; i++)
  {
     var randomObj = new Random();
     output += source.Substring(randomObj.Next(source.Length), 1);
  }

  return output;
}
Run Code Online (Sandbox Code Playgroud)

我这样调用这个函数:

var randomPassword = StringHelper.CreateRandomPassword(5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
Run Code Online (Sandbox Code Playgroud)

现在,这个方法几乎总是返回像"AAAAAA","BBBBBB","888888"等随机字符串,我认为它应该返回像"A8JK2A","82mOK7"等字符串.

然而,这里是奇怪的部分; 如果我放置一个断点,并逐行逐步执行此迭代,我会得到正确类型的密码作为回报.在100%的其他情况下,当我没有调试时,它给了我像"AAAAAA","666666"等废话.

这怎么可能?任何建议都非常感谢!:-)

BTW,我的系统:Visual Studio 2010,C#4.0,ASP.NET MVC 3 RTM项目,带ASP.NET开发服务器.尚未在任何其他环境中测试此代码.

Ken*_*ith 15

在循环外移动randomObj的声明.当你进行调试时,每次都会用新的种子创建它,因为种子的时间差异足够大.但是当你没有调试时,循环的每次迭代的种子时间基本相同,所以每次都给你相同的起始值.

对于这种事情,使用StringBuilder而不是字符串是一个很好的习惯,因此每次将字符追加到字符串时都不必重新初始化内存空间.

换句话说,像这样:

public static string CreateRandomPassword(int outputLength, string source = "")
{
  var output = new StringBuilder();
  var randomObj = new Random();
  for (var i = 0; i < outputLength; i++)
  {
     output.Append(source.Substring(randomObj.Next(source.Length), 1));
  }
  return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • +1.再说一遍,尽可能少地声明随机对象几乎总是更好.我甚至将声明提取到静态字段中.如果你有两个线程同时点击这个功能,你有可能得到完全相同的密码吐出. (2认同)