为什么静态方法有时 returns 单独调用的结果相同?
Why Static method sometimes returns same result for separate call?
在我的 C# 代码中,我有一个静态方法。这是代码示例:
public class RandomKey
{
public static string GetKey()
{
Random rng = new Random();
char[] chars = new char[8];
for (int i = 0; i < chars.Length; i++)
{
int v = rng.Next(10 + 26 + 26);
char c;
if (v < 10)
{
c = (char)('0' + v);
}
else if (v < 36)
{
c = (char)('a' - 10 + v);
}
else
{
c = (char)('A' - 36 + v);
}
chars[i] = c;
}
string key = new string(chars);
key += DateTime.Now.Ticks.ToString();
return key;
}
}
我正在从另一个 Class 的方法调用此函数。
Class SomeClass
{
Void SomeMethod()
{
for(int i=0; i<100; i++)
{
System.Diagnostics.Debug.WriteLine(i + "===>" + RandomKey.GetKey());
}
}
}
但现在的问题是,尽管函数是单独调用的,但有时我会从静态方法中得到相同的输出。我的代码有问题吗?
原因是您正在方法中初始化 Random
对象。
当您在接近的时间调用该方法时(如在循环内),Random
对象将使用相同的种子进行初始化。 (请参阅 Matthew Watson's 了解原因。)
为防止出现这种情况,您应该将 Random
对象声明并初始化为静态字段,如下所示:
public class RandomKey
{
static Random rng = new Random();
public static string GetKey()
{
// do your stuff...
}
}
您不断重新初始化随机值。将其移至静态字段。您还可以使用带有格式化程序的 ToString
以十六进制格式格式化数字。
另外,DateTime.Now
是个坏主意。有关分配唯一时间戳值的更好方法,请参阅 this answer。
在我的 C# 代码中,我有一个静态方法。这是代码示例:
public class RandomKey
{
public static string GetKey()
{
Random rng = new Random();
char[] chars = new char[8];
for (int i = 0; i < chars.Length; i++)
{
int v = rng.Next(10 + 26 + 26);
char c;
if (v < 10)
{
c = (char)('0' + v);
}
else if (v < 36)
{
c = (char)('a' - 10 + v);
}
else
{
c = (char)('A' - 36 + v);
}
chars[i] = c;
}
string key = new string(chars);
key += DateTime.Now.Ticks.ToString();
return key;
}
}
我正在从另一个 Class 的方法调用此函数。
Class SomeClass
{
Void SomeMethod()
{
for(int i=0; i<100; i++)
{
System.Diagnostics.Debug.WriteLine(i + "===>" + RandomKey.GetKey());
}
}
}
但现在的问题是,尽管函数是单独调用的,但有时我会从静态方法中得到相同的输出。我的代码有问题吗?
原因是您正在方法中初始化 Random
对象。
当您在接近的时间调用该方法时(如在循环内),Random
对象将使用相同的种子进行初始化。 (请参阅 Matthew Watson's
为防止出现这种情况,您应该将 Random
对象声明并初始化为静态字段,如下所示:
public class RandomKey
{
static Random rng = new Random();
public static string GetKey()
{
// do your stuff...
}
}
您不断重新初始化随机值。将其移至静态字段。您还可以使用带有格式化程序的 ToString
以十六进制格式格式化数字。
另外,DateTime.Now
是个坏主意。有关分配唯一时间戳值的更好方法,请参阅 this answer。