Статический конструктор не вызывается? - PullRequest
0 голосов
/ 25 сентября 2019

[Редактировать] Я забыл добавить статическое ключевое слово и не связал это, потому что я назвал класс Statics

Я создаю клиентское приложение Blazor.

Я пытаюсь создать статический метод, который я хочу вернуть случайное имя из файла.

public class Statics
{
    private static List<string> _names;

    public Statics()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "[AssemblyName].Stuff.first-names.json";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd();
            _names = JsonSerializer.Deserialize<List<string>>(result);
        }
    }

    public static string GetRandomName()
    {
        var random = new Random();
        return _names[random.Next(_names.Count)];
    }
}

Я пытаюсь загрузить файл в статический конструктор, чтобы не загружать файл большечем один раз, и insted сохранить имена в памяти.

Но когда я вызываю метод GetRandomName, я получаю исключение nullrefrence в списке

Это прекрасно работает, если я скопирую код для загрузки файлав метод

   public static string GetRandomName()
    {
        var random = new Random();

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "[AssemblyName].Stuff.first-names.json";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd();
            _names = JsonSerializer.Deserialize<List<string>>(result);
        }

        return _names[random.Next(_names.Count)];
    }

Я также попытался просто заполнить список любой строкой в ​​конструкторе (это тоже не сработало)

 public class Statics
{
    private static List<string> _names;

    public Statics()
    {
        _names = new List<string>() { "hello", "World", "Something" };
    }

    public static string GetRandomName()
    {
        var random = new Random();

        return _names[random.Next(_names.Count)];
    }
}

Я понимаю концепциюСтатический конструктор в c # as

Когда вы ссылаетесь на поле или свойство в статическом классе с помощью статического конструктора.Вы уверены, что конструктор будет запущен до того, как вы получите доступ к полю или свойству (но вы не можете точно определить, когда).

Проблема в моем коде?Мое понимание?или пиджак моно время выполнения?

1 Ответ

3 голосов
/ 25 сентября 2019

Ваш класс не имеет статического конструктора.public Statics () является конструктором экземпляра.Чтобы быть статическим конструктором, вам нужно использовать ключевое слово static (и удалить публичный модификатор).

Так что измените это:

public Statics()

на

static Statics()

... и я подозреваю, что все будет хорошо, хотя если ваш класс действительно предназначен только для включения статических членов, вы можете также объявить его как статический класс.

Я бы также по крайней мере опасался делать слишком много работы в статическом конструкторе.Проблемы с инициализаторами типов (включая статические конструкторы) могут быть очень трудными для решения - и в настоящее время у вас есть синхронный ввод-вывод в месте, которое довольно сложно для всего, что использует ваш код, изменить с точки зрения синхронизации.

Может быть, все в порядке - это просто то, что нужно знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...