题
我有以下代码:
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 Web服务器运行时发生(VS 2010)。
解决方案
存在或不存在 this
无法解释您目睹的错误。在这种情况下,它们的意思是完全相同的事情,并将编译为同一IL代码。使用.NET反射器检查组件以验证此功能。该错误是随机发生的,可能是由于种族条件。
我可以立即看到的一件事是,如果您是从多个线程运行此代码,那么您似乎在这里有赛车条件:
if (this.service == null)
{
this.service = new CustomerService();
}
return this.service;
在多线程的情况下,您需要锁定,否则您可以获得两个客户服务对象。我不确定这是否可以解释您的错误,但肯定会造成混乱。种族条件可以在一个环境中发生,而不是在另一个环境中发生,因为错误的频率可能取决于硬件的类型以及服务器上其他过程。
您还可能在未发布的代码中有其他种族条件. 。除非您是 当然 您只有一个线程。
其他提示
您可能与另一个“服务”(类或名称空间)有一个名称冲突。指某东西的用途 this
解决它。
我对Cassinin和II之间的区别有点怀疑,您是否仔细检查了一下?
这样的东西应该在 辛格尔顿. 。如果正确实施,这将解决许多问题,例如线程,并使代码的实现和可读性更好。
谢谢-Blake Niemyjski(.nettiers团队成员)
我在Visual Studio中对您的代码有些摆弄,甚至无法获得名称冲突来产生您描述的错误消息。我想不出任何情况,“ this.x”与“ x”不同,除非“ x”是一个 本地变量 或a 方法参数.
会 CustomerService
班级来自一个名为的基类 Service
?如果是这样,那就是问题所在。
不隶属于 StackOverflow