Pregunta

Tengo el siguiente código:

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

public DataTable GetCustomers()
{
    return this.Service.GetCustomers();
}

Ahora la pregunta es: si escribía el método anterior de la siguiente manera (sin "este"), me está dando un error:. Instancia no se hace referencia a un objeto

public DataTable GetCustomers()
{
    return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}
conozco a nadie

lo hace? También sucede solamente mientras se ejecuta a través de IIS y no del servidor web Casini (VS 2010).

¿Fue útil?

Solución

La presencia o ausencia de this no puede explicar el error que está presenciando. En esta situación que significan exactamente lo mismo y compilará al mismo código IL. Compruebe el montaje utilizando .NET Reflector para verificar esto si lo desea. El error se produce al azar, probablemente debido a una condición de carrera.

Una cosa que puedo ver de inmediato es que si está ejecutando el código de múltiples hilos, entonces parece que tiene una condición de carrera aquí:

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

En el caso de multiproceso que se necesita para bloquear de lo contrario se podría conseguir dos objetos Servicio al cliente. No estoy seguro si esto explica su error, pero sin duda podría crear confusión. Las condiciones de carrera pueden ocurrir en un solo entorno, pero no en otros, como la frecuencia del error puede depender del tipo de los equipos y en qué otros procesos se están ejecutando en el servidor.

Usted también puede tener otras condiciones de carrera en el código no se ha publicado . No utilice esta técnica de inicialización perezosa sin bloquear a menos que esté seguro que tiene sólo un hilo.

Otros consejos

Es probable que tenga un conflicto con otro nombre 'Servicio' (clase o espacio de nombres). El uso de this resuelve.

Soy un poco escéptico acerca de la diferencia entre Cassinin e IIS, ¿ha observado cuidadosamente en eso?

Algo como esto debe estar en un Singleton . Que resolvería muchos problemas como enhebrar si se aplica correctamente y haría que la aplicación y la legibilidad del código mucho mejor.

Gracias -Blake Niemyjski (.netTiers miembro del equipo)

Me jugueteó un poco con su código en Visual Studio y ni siquiera podía conseguir un conflicto de nombres para producir el mensaje de error que ha descrito. No puedo pensar en ningún caso en el que “this.x” nunca puede ser diferente de “X”, excepto cuando “X” es un variable local o método de parámetros .

¿Podría la clase derivan CustomerService de una clase base llamada Service? Si es así, entonces ese es el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top