2010-08-14 2 views
-1

У меня есть следующий код:что бы сделало «это» предложение другим?

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).

+0

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

+1

В каком контексте выполняется этот код? Код позади, Контроллер и т. Д.? Что Intellisense вы видите, когда попадаете. в примере «Service.»? – Lazarus

+0

это настолько запутанно. Теперь даже с предложением «this» он дает мне ошибку ссылки на объект, не установленную на экземпляр объекта. В настоящий момент класс содержит только те строки кодов. ни один другой объект службы не заявлен .. действительно странно .. – user384080

ответ

2

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

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

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

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

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

+0

не уверен в этом гоночном деле, но когда я создал объект CustomerServiceClass в событии page_load (используется вне события page_load), теперь он работает нормально. – user384080

1

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

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

+0

Я пробовал, и я не мог построить ситуацию, когда класс или пространство имен с тем же именем конфликтуют с именем поля. Имя поля всегда имеет приоритет. 'this', похоже, имеет значение только тогда, когда это локальная переменная или параметр метода. Я что-то пропустил? – Timwi

0

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

+1

И вы также использовали код для развертывания в IIS? –

0

Может ли класс CustomerService получить базовый класс под названием Service? Если это так, то в этом проблема.

+1

Нет, попробовал - имя свойства скрывает класс. – Timwi

1

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

Благодаря -Blake Niemyjski (член команды .netTiers)

Смежные вопросы