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)
归档时间: |
|
查看次数: |
563 次 |
最近记录: |