Вопрос

У меня есть следующий код:

CustomerService service;
public CustomerService Service
{
    get
    {
        if (this.service == null)
        {
            this.service = new CustomerService();
        }
        return this.service;
    }
}

public DataTable GetCustomers()
{
    return this.Service.GetCustomers();
}

Сейчас вопрос: если я написал вышеуказанный метод, как следует (без «этого»), он дает мне ошибку: экземпляр не имеет ссылки на объект.

public DataTable GetCustomers()
{
    return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}

Кто-нибудь знает? Также это происходит только во время работы через IIS, а не из веб-сервера Casini (VS 2010).

Это было полезно?

Решение

Наличие или отсутствие this не может объяснить ошибку, которую вы наблюдаете. В этой ситуации они означают ровно то же самое и будут компилировать тот же код IL. Проверьте сборку с помощью рефлектора .NET, чтобы убедиться, что если вы хотите. Ошибка происходит случайно, вероятно, из-за состояния гонки.

Одна вещь, которую я могу сразу увидеть, это то, что если вы запустите этот код из нескольких потоков, то похоже, у вас здесь есть состояние гонки здесь:

if (this.service == null)
{
    this.service = new CustomerService();
}
return this.service;

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

Вы также можете иметь другие расходовые условия в коде, который вы не разместили. Отказ Не используйте эту технику инициализации не блокировки, если вы не Конечно что у вас есть только одна нить.

Другие советы

У вас, вероятно, есть конфликт имени с другим «сервисом» (классом или пространством имен). Использование this решает это.

Я немного скептически относился к разнице между Кассинином и IIS, вы тщательно проверили это?

Что-то вроде этого должно быть в синглтон. Отказ Что будет решать многие проблемы, такие как резьба, если они будут реализованы правильно, и сделает реализацию и доступность кода намного лучше.

Спасибо -blakekake niemejski (член команды команды)

Я немного сморался с вашим кодом в Visual Studio, и я даже не мог получить конфликт с именем, чтобы произвести описанное вами сообщение об ошибке. Я не могу думать о каком-либо случате, в котором «this.x» может быть отличаться от «х», за исключением случаев, когда «X» является локальная переменная или а Способ параметра.

Бы то CustomerService Класс вытекает из базового класса Service? Если это так, то это проблема.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top