Как статическая область только для чтения может быть пустой?

Таким образом, вот выдержка из одного из моих классов:

    [ThreadStatic]
    readonly static private AccountManager _instance = new AccountManager();

    private AccountManager()
    {
    }

    static public AccountManager Instance
    {
        get { return _instance; }
    }

Как Вы видите, это - единичный предмет за нить - т.е. случай отмечен признаком ThreadStatic. Случай также иллюстрируется примерами как часть статического строительства.

Так, чтобы имение место, как возможно, что я получаю NullReferenceException в своем заявлении MVC ASP.NET, когда я пытаюсь использовать собственность Случая?

27
задан gerrod 11 January 2010 в 17:12
поделиться

4 ответа

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

Map<String, JTextField> guiFields = new HashMap<String, JTextField>();

Тогда код do

guiFields.get(inputName).setText(value);
-121--2296099-

Проблема не в инструкции import . Проблема в том, что операторы потока управления не работают встроенными в команду python. Замените эту инструкцию import любой другой инструкцией, и вы увидите ту же проблему.

Подумайте об этом: Питон не может загнать все. Он использует отступы для группирования потока управления.

-121--648832-

Предложение MSDN ThreadStartAttribute :

Не указывайте начальные значения для поля, отмеченные ThreadStartAttribute, так как инициализация происходит только один раз, когда выполняется конструктор класса, и поэтому влияет только на один поток. Если начальное значение не указывается, вы можете полагаться на то, что поле является инициализировано до значения по умолчанию, если оно является типом значения или имеет значение null ссылка (Ничего в Visual Basic), если это ссылочный тип.

38
ответ дан 28 November 2019 в 04:50
поделиться

Это запутанная часть атрибута ThreadStatic . Несмотря на то, что он создает значение на поток, код инициализации работает только на одном из потоков. Все другие потоки, которые получают доступ к этому значению, получит значение по умолчанию для этого типа вместо результата кода инициализации.

Вместо инициализации значения оберните его в свойство, которое делает для вас инициализацию.

[ThreadStatic]
readonly static private AccountManager _instance;

private AccountManager()
{
}

static public AccountManager Instance
{
  get 
  { 
    if ( _instance == null ) _instance = new AccountManager();
    return _instance; 
  }
}

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

12
ответ дан 28 November 2019 в 04:50
поделиться

Вы попали в классику [ThreadStatic] «101» здесь.

Статический инициализатор будет только один раз, , хотя это помечено как [ThreadStatic] , поэтому другие потоки (кроме первых) увидят этот неинициализированный.

8
ответ дан 28 November 2019 в 04:50
поделиться

Я верю, что происходит, состоит в том, что статическое поле будет инициализируется только один раз, поэтому, когда другая нить пытается прочитать поле, оно будет нулевым (поскольку его значение по умолчанию), потому что _Instance не может быть инициализированным снова. Это просто мысль, но и я мог бы быть полностью выходить, но это то, что я думаю, происходит.

1
ответ дан 28 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: