Если вам дали этот совет, кто-то, вероятно, предлагает вам объявить переменную экземпляра, но инициализировать ее в своем конструкторе.Например:
public class Foo
{
private readonly Random rnd;
public Foo()
{
rnd = new Random();
// Other construction code
}
}
Тогда вы можете использовать rnd
в любом месте вашего класса.
На самом деле это в основном эквивалентно:
public class Foo
{
private readonly Random rnd = new Random();
public Foo()
{
// Other construction code
}
}
... которыйЯ в основном предпочитаю, так как это показывает, что инициализация rnd
не имеет никакого отношения к каким-либо параметрам конструктора.
Поскольку кажется, что часть ваших трудностей связана с переменной guessMe
, вот более полная версия:
public class Foo
{
private readonly Random rnd = new Random();
private int guessMe;
public Foo()
{
guessMe = rng.Next(0, 100);
}
}
Предполагается, что вам нужно, чтобы guessMe
была переменной экземпляра, чтобы вы могли обращаться к ней по всему классу.С другой стороны, возможно, вам не нужна переменная Random
, чтобы быть переменной экземпляра - если вы генерируете только одно случайное число, это было бы лучше, как:
public class Foo
{
private readonly int guessMe;
public Foo()
{
Random rnd = new Random();
guessMe = rnd.Next(0, 100);
}
}
Однако личноЯ бы не использовал ни один из этих подходов.Я бы использовал технику, которая создает один экземпляр Random
для каждого потока, чтобы избежать опасностей, связанных с Random
, не являющихся безопасными для потоков, и рисков, связанных с созданием двух экземпляров Random
, очень близких друг к другу ввремя и заканчивая тем же семенем.
Я написал об этом достаточно много в статье на моем сайте , включая этот класс:
using System;
using System.Threading;
public static class RandomProvider
{
private static int seed = Environment.TickCount;
private static ThreadLocal<Random> randomWrapper =
new ThreadLocal<Random>(() =>
new Random(Interlocked.Increment(ref seed))
);
public static Random GetThreadRandom()
{
return randomWrapper.Value;
}
}
Вы можете либо использовать RandomProvider
напрямую (вызывая GetThreadRandom
каждый раз, когда вам нужно сгенерировать случайное число), либо вы можете передать RandomProvider.GetThreadRandom
в свой класс в качестве аргумента конструктора для параметра типа Func<Random>
- т.е. внедрить зависимость«Я хочу иметь возможность получить экземпляр Random
в любое время».