我有以下代码:

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?如果是这样,那就是问题所在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top