¿Es legal llamar a un método sobre un objeto desechado? ¿Si es así por qué?¿Por qué un objeto eliminado no arroja una excepción al usarlo después de eliminarlo?
En el siguiente programa de demostración, tengo una clase desechable A
(que implementa IDisposable
interfaz) .AS lo que sé, si paso objeto desechable para using()
constructo, a continuación, Dispose()
método obtiene llamado automáticamente en el corchete de cierre:
A a = new A();
using (a)
{
//...
}//<--------- a.Dispose() gets called here!
//here the object is supposed to be disposed,
//and shouldn't be used, as far as I understand.
Si esto es correcto, entonces por favor explicar la salida de este programa:
public class A : IDisposable
{
int i = 100;
public void Dispose()
{
Console.WriteLine("Dispose() called");
}
public void f()
{
Console.WriteLine("{0}", i); i *= 2;
}
}
public class Test
{
public static void Main()
{
A a = new A();
Console.WriteLine("Before using()");
a.f();
using (a)
{
Console.WriteLine("Inside using()");
a.f();
}
Console.WriteLine("After using()");
a.f();
}
}
salida (ideone):
Before using()
100
Inside using()
200
Dispose() called
After using()
400
¿Cómo puedo llamar f()
en el objeto desechado a
? Está permitido? Si es así, ¿por qué? Si no, ¿por qué el programa anterior no da excepción en tiempo de ejecución?
sé que la construcción popular de usar using
es la siguiente:
using (A a = new A())
{
//working with a
}
Pero yo sólo estoy experimentando, es por eso que he escrito de manera diferente.
Veo que a alguien le falta la naturaleza determinista de la gestión de la memoria en C++. :) – ChaosPandion
Entonces, lo que estás diciendo es: escribí un programa que no implementa el contrato de objetos desechables, y cuando lo ejecuto, no implementa el contrato de objetos desechables. ** Usted ** es responsable de implementar ese comportamiento. No lo hiciste Ve hazlo. –