c#ref for speed

PRA*_*T P 0 c# performance ref

我完全理解.NET中的引用词

既然使用相同的变量,会增加使用ref而不是复制的速度吗?

我发现密码一般是瓶颈.

这是我的代码

protected internal string GetSecurePasswordString(string legalChars, int length)
{
    Random myRandom = new Random();
    string myString = "";
    for (int i = 0; i < length; i++)
    {
        int charPos = myRandom.Next(0, legalChars.Length - 1);
        myString = myString + legalChars[charPos].ToString();
    }
    return myString;
}
Run Code Online (Sandbox Code Playgroud)

在lawchars之前更好地参考?

Mar*_*ade 9

按值传递字符串不会复制字符串.它只复制对字符串的引用.通过引用而不是按值传递字符串没有性能优势.


Jon*_*eet 5

不,你不应该把这个字符串引用参考.

然而,你毫无意义的创建多个字符串.如果您正在创建长密码,那么这可能是它成为瓶颈的原因.这是一个更快的实现:

protected internal string GetSecurePasswordString(string legalChars, int length)
{
    Random myRandom = new Random();
    char[] chars = new char[length];
    for (int i = 0; i < length; i++)
    {
        int charPos = myRandom.Next(0, legalChars.Length - 1);
        chars[i] = legalChars[charPos];
    }
    return new string(chars);
}
Run Code Online (Sandbox Code Playgroud)

但是,它仍有三大缺陷:

  • Random每次都会创建一个新实例.如果您快速连续两次调用此方法,您将获得两次相同的密码.馊主意.
  • Random.Next()调用中指定的上限是独占的 - 因此您永远不会使用最后一个字符legalChars.
  • 它使用System.Random,并不意味着以任何方式加密安全.鉴于这是为了"安全密码",你应该考虑使用类似的东西System.Security.Cryptography.RandomNumberGenerator.这样做的工作量更大,因为API更难,但你最终会得到一个更安全的系统(如果你做得恰到好处).

如果你真的偏执,你可能还想考虑使用SecureString.