Использует ли linqpad случайное начальное число между запросами? - PullRequest
0 голосов
/ 30 марта 2020

Для этого кода:

void Main()
{
    var testRandom = new TestRandom();
    testRandom.RandGen.Dump("Property1");
    testRandom.RandGen.Dump("Property2");
    TestRandom.rngStatic.Dump("Static field1");
    TestRandom.rngStatic.Dump("Static field2");
    testRandom.rngInstance.Dump("Instance field1");
    testRandom.rngInstance.Dump("Instance field2");
}

// Define other methods, classes and namespaces here

class TestRandom
{
    private static Random _rnd = new System.Random();
    public static int rngStatic = _rnd.Next();
    public int rngInstance = _rnd.Next();
    public int RandGen =>  _rnd.Next();
}

Я получаю следующий результат в LinqPad:

Property1 167577867

Property2 2076433106

Stati c field1 1758463813

Stati c field2 1758463813

Поле экземпляра1 1875178546

Поле экземпляра2 1875178546

Поле c Поле 1 и 2, поля 1 и 2 экземпляра показывают одно и то же случайное число при выполнении в одном запросе. Это, как и ожидалось, однако, даже когда я перезапущу запрос, в полях экземпляра 1 и 2 будет отображаться то же случайное число, что и в предыдущих запусках. Поэтому я подозреваю, что семя исправлено, но не смогло это подтвердить

Второй прогон запроса:

Property1 1860313679

Property2 1472007479

Stati c field1 1758463813

Stati c field2 1758463813

Поле экземпляра1 1370753000

Поле экземпляра2 1370753000

1 Ответ

1 голос
/ 30 марта 2020

Нет. Почему LinqPad должен иметь специальную обработку для случайных чисел, которая делает его несовместимым с другими приложениями?

Он скомпилирует каждый запрос в отдельную сборку и инициализирует переменные состояния c только один раз. Чтобы выгрузить сборку, необходимо уничтожить домен AppDomain, содержащий сборку.

Таким образом, также возможно, что он создает домен AppDomain для каждого запроса и повторно использует этот домен AppDomain для последующих запусков. Но с проверкой AppDomain.CurrentDomain, похоже, это не так. Итак, у нас есть 1 AppDomain и несколько сборок.

Вы можете подтвердить это, вставив Console.WriteLine("Test"); в код, чтобы он нуждался в перекомпиляции. Вы получите новый номер.

...