我有以下代码:
CustomerService service;
public CustomerService Service
{
get
{
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
}
}
public DataTable GetCustomers()
{
return this.Service.GetCustomers();
}
现在的问题是:如果我按照以下方式编写上述方法(没有“this”),它会给我一个错误:实例不是对象的引用。
public DataTable GetCustomers()
{
return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}
有谁知道吗?它也只发生在通过IIS而不是从casini Web服务器(VS 2010)运行时。
答案 0 :(得分:2)
this
的存在与否无法解释您正在目睹的错误。在这种情况下,它们的意思完全相同,并将编译为相同的IL代码。如果您愿意,请使用.NET Reflector检查程序集以验证此问题。错误是随机发生的,可能是由于竞争条件造成的。
我可以立即看到的一件事是,如果您从多个线程运行此代码,那么看起来您在这里遇到竞争条件:
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
在多线程情况下,您需要锁定,否则您可能会获得两个CustomerService对象。我不确定这是否能解释你的错误,但肯定会造成混乱。竞争条件可以在一个环境中发生,但在另一个环境中不发生,因为错误的频率可能取决于硬件的类型以及服务器上正在运行的其他进程。
您可能还有未发布的代码中的其他竞争条件。除非你确定你只有一个帖子,否则不要在没有锁定的情况下使用这种懒惰的初始化技术。
答案 1 :(得分:1)
您可能与另一个“服务”(类或命名空间)存在名称冲突。 this
的使用解决了它。
我对Cassinin和IIS之间的区别持怀疑态度,你仔细检查过吗?
答案 2 :(得分:1)
这样的事情应该在singleton中。如果正确实现,这将解决许多问题,如线程,并使代码的实现和可读性更好。
由于 -Blake Niemyjski(.netTiers团队成员)
答案 3 :(得分:0)
我在Visual Studio中对你的代码进行了一些调整,我甚至无法得到名称冲突来产生你描述的错误消息。我想不出任何“this.X”可能与“X”不同的情况,除非“X”是局部变量或方法参数
答案 4 :(得分:0)
CustomerService
类是否派生自名为Service
的基类?如果是这样,那就是问题所在。