2013-08-11 20 views
8

Tôi có mã này, tôi lo ngại rằng nó "không an toàn" Tôi đã sử dụng Vứt bỏ() trước khi tuyên bố sử dụng kết thúc, đối với tôi nó hơi phi logic, nhưng nó hoạt động tốt. Vì vậy, nó có an toàn không?Điều gì xảy ra nếu tôi gọi là Vứt bỏ() trước khi sử dụng kết thúc câu lệnh?

using (FileStream stream = new FileStream(SfilePath, FileMode.Open)) 
{ 
    try 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel)); 
     HVM = deserializer.Deserialize(stream) as HighscoresViewModel; 
    } 
    catch (InvalidOperationException) 
    { 
     stream.Dispose(); 
     (new FileInfo(SfilePath)).Delete(); 
     HVM = new HighscoresViewModel(); 
    } 
} 
+0

Nó sẽ cố gắng vứt bỏ đối tượng hai lần –

+0

@JeroenvanLangen: điều đó không chính xác. Xem câu trả lời của hwd. – siride

+0

@siride - 'luồng' _will_ được xử lý hai lần. Lỗi duy nhất trong bình luận Jeroens là từ 'try'. –

Trả lời

14

Các tài liệu cho IDisposable.Dispose trạng thái:

Nếu phương thức Dispose của một đối tượng được gọi là nhiều hơn một lần, đối tượng phải bỏ qua tất cả các cuộc gọi sau khi người đầu tiên. Đối tượng không được ném ngoại lệ nếu phương thức Vứt bỏ của nó được gọi nhiều lần. Các phương thức khác ngoài Dispose có thể ném một ObjectDisposedException khi các tài nguyên đã được xử lý.

Giả sử IDisposable được triển khai chính xác, việc sử dụng này an toàn. Dispose sẽ được gọi là lần thứ hai và sẽ không thực hiện lần thứ hai.

1

Cũng như được nói bởi @hvd rằng việc sử dụng này là an toàn; nhưng nó không được khuyến khích vì nếu bạn thực hiện Microsoft Fxcop trên mẫu mã của bạn nó sẽ ném ra một cảnh báo FxCop/lỗi CA2202: Do not dispose objects multiple times

See here

Mà nói

Một phương pháp thực hiện có chứa đường dẫn mã mà có thể gây ra nhiều gọi tới IDisposable.Dispose hoặc Dispose tương đương, chẳng hạn như phương thức Close() trên một số loại, trên cùng một đối tượng.

Các vấn đề liên quan