Что сделало бы «этот» пункт отличаться?
Вопрос
У меня есть следующий код:
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
? Если это так, то это проблема.