Có hợp pháp để gọi phương thức trên đối tượng được xử lý không? Nếu đúng thì tại sao?Tại sao đối tượng được xử lý không ném ngoại lệ khi sử dụng nó sau khi xử lý?
Trong chương trình giới thiệu sau đây, tôi đã là một lớp dùng một lần A
(mà thực hiện giao diện IDisposable
) .as xa như tôi biết, nếu tôi vượt qua đối tượng dùng một lần để using()
xây dựng, sau đó Dispose()
phương pháp được gọi tự động vào khung bế mạc:
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.
Nếu điều đó là đúng, sau đó hãy giải thích kết quả của chương trình này:
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();
}
}
Output (ideone):
Before using()
100
Inside using()
200
Dispose() called
After using()
400
Tôi có thể gọi f()
trên đối tượng được xử lý a
? Điều này có được phép không? Nếu có, thì tại sao? Nếu không, thì tại sao chương trình trên không đưa ra ngoại lệ trong thời gian chạy?
Tôi biết rằng cấu trúc phổ biến của việc sử dụng using
là thế này:
using (A a = new A())
{
//working with a
}
Nhưng tôi chỉ thử nghiệm, đó là lý do tại sao tôi đã viết nó khác nhau.
Tôi thấy ai đó thiếu tính chất xác định của quản lý bộ nhớ trong C++. :) – ChaosPandion
Vì vậy, những gì bạn đang nói là: Tôi đã viết một chương trình không thực hiện các hợp đồng của các đối tượng dùng một lần, và khi tôi chạy nó, nó không thực hiện hợp đồng của các đối tượng dùng một lần. ** Bạn ** chịu trách nhiệm thực hiện hành vi đó. Bạn đã không làm điều đó. Đi làm đi. –