2010-05-04 28 views
12

Tôi mới sử dụng C# và .NET, và đã đọc xung quanh nó.Tài nguyên phát hành trong .Net C#

Tôi cần biết tại sao và khi nào tôi cần giải phóng tài nguyên? Không phải người thu gom rác có chăm sóc mọi thứ không? Khi nào tôi cần phải thực hiện IDisposable, và làm thế nào là nó khác với destructor trong C + +?

Ngoài ra, nếu chương trình của tôi khá nhỏ, tức là một trình bảo vệ màn hình, tôi có cần quan tâm đến việc phát hành tài nguyên không?

Cảm ơn.

+0

Hãy thử liên kết này - http://ondotnet.com/pub/a/oreilly/dotnet/news/programmingCsharp_0801.html – Gishu

+1

Câu hỏi này cũng liên quan: http://stackoverflow.com/questions/317184/c-using -keyword-when-and-when-not-to-use-it –

Trả lời

2

Về cơ bản, bạn cần phải lo lắng về việc giải phóng tài nguyên cho mã không được quản lý - bất kỳ thứ gì bên ngoài khuôn khổ .NET. Ví dụ, một kết nối cơ sở dữ liệu hoặc một tập tin trên hệ điều hành.

Bộ thu gom rác giao dịch với mã được quản lý - mã trong khuôn khổ .NET.

Ngay cả một ứng dụng nhỏ có thể cần phải giải phóng tài nguyên không được quản lý, ví dụ như nó có thể ghi vào một tệp văn bản cục bộ. Khi bạn đã hoàn thành với tài nguyên bạn cần để đảm bảo phương thức Vứt bỏ của đối tượng được gọi. Tuyên bố using đơn giản hoá cú pháp:

using (TextWriter w = File.CreateText("test.txt")) 
{ 
    w.WriteLine("Test Line 1"); 
} 

Đối tượng TextWriter thực hiện các giao diện IDisposable càng sớm càng khối sử dụng xong phương thức Dispose được gọi và các đối tượng có thể được thu gom rác. Thời gian thu thập thực tế không thể được đảm bảo.

Nếu bạn tạo các lớp học của riêng bạn cần được xử lý đúng cách, bạn sẽ cần phải triển khai giao diện IDisposable và Tự bỏ mẫu. Trên một ứng dụng đơn giản, bạn có thể sẽ không cần phải làm điều này, nếu bạn làm this là một nguồn tài nguyên tốt.

+0

Giải thích hay. – Ram

1

Bạn không cần giải phóng bộ nhớ trong các đối tượng được quản lý như chuỗi hoặc mảng - được xử lý bởi bộ thu gom rác.

Bạn nên dọn sạch tài nguyên hệ điều hành và một số đối tượng không được quản lý khi bạn đã sử dụng xong chúng. Nếu bạn mở một tệp, bạn nên luôn nhớ đóng tệp đó khi bạn đã sử dụng xong. Nếu bạn mở một tệp độc quyền và quên đóng, lần tiếp theo bạn cố gắng mở tệp đó, tệp có thể vẫn bị khóa. Nếu một cái gì đó thực hiện IDisposable, bạn chắc chắn nên xem xét cho dù bạn cần phải đóng nó đúng cách. Tài liệu này thường sẽ cho bạn biết phương thức Dispose là gì và khi nào nó nên được gọi.

Nếu bạn quên, trình thu gom rác cuối cùng sẽ chạy trình hoàn chỉnh để dọn sạch đối tượng và giải phóng tài nguyên không được quản lý, nhưng điều này không xảy ra ngay lập tức sau khi đối tượng đủ điều kiện thu gom rác và thực tế có thể không chạy chút nào.

Cũng hữu ích khi biết về câu lệnh using.

14

Bộ thu gom rác chỉ biết về bộ nhớ. Đó là tốt cho bộ nhớ, bởi vì một chút bộ nhớ là khá nhiều như tốt như bất kỳ khác, miễn là bạn đã có đủ của nó. (Đây là tất cả sự kết hợp của bộ nhớ đệm modulo, v.v.)

Bây giờ so sánh với bộ xử lý tệp. Hệ điều hành có thể có nhiều chỗ để phân bổ nhiều tập tin hơn - nhưng nếu bạn để một tay cầm mở cho một tập tin cụ thể, không ai khác có thể mở tập tin cụ thể đó để viết. Bạn nên thông báo cho hệ thống khi bạn đã hoàn thành với một xử lý - thường là bằng cách đóng luồng tương ứng - ngay sau khi bạn hoàn tất, và làm như vậy theo cách đóng nó ngay cả khi một ngoại lệ được ném ra. Điều này thường được thực hiện với tuyên bố using, giống như lần thử/cuối cùng với cuộc gọi đến Dispose trong khối cuối cùng.

Các cấu trúc trong C++ là rất khác với .NET finalizers, như C++ destructors là xác định - chúng tự động được gọi khi biến có liên quan nằm ngoài phạm vi, ví dụ. Trình tổng hợp được chạy bởi bộ thu gom rác tại một số điểm sau khi một đối tượng không còn được tham chiếu bởi bất kỳ đối tượng "trực tiếp" nào, nhưng thời gian là không thể đoán trước. (Trong một số trường hợp hiếm gặp, nó có thể bao giờ xảy ra.)

Bạn nên thực hiện IDisposable mình nếu bạn có bất cứ dọn dẹp mà nên được thực hiện tất định - thường đó là trường hợp nếu một trong các biến Ví dụ bạn cũng cụ IDisposable. Thật hiếm khi những ngày này cần phải tự mình hoàn thành - bạn thường chỉ cần một nếu bạn có trực tiếp giữ trên tay cầm hệ điều hành, thường ở dạng IntPtr; SafeHandle làm cho tất cả điều này dễ dàng hơn nhiều và giải phóng bạn khỏi phải tự mình viết bản finalizer.

2

Tài nguyên thuộc hai loại - được quản lý và không được quản lý. Tài nguyên được quản lý sẽ được dọn dẹp bởi bộ thu gom rác nếu bạn để nó - tức là, nếu bạn giải phóng bất kỳ tham chiếu nào đến đối tượng. Tuy nhiên, bộ sưu tập rác không biết cách giải phóng tài nguyên không được quản lý mà một đối tượng được quản lý nắm giữ - các xử lý tệp và các tài nguyên hệ điều hành khác chẳng hạn.

IDisposable là phương pháp hay nhất khi có tài nguyên được quản lý bạn muốn phát hành ngay lập tức (như kết nối cơ sở dữ liệu) và quan trọng khi có tài nguyên không được quản lý mà bạn cần phải phát hành. Mẫu điển hình:

public void Dispose() 
protected void Dispose(bool disposing) 

Cho phép bạn đảm bảo rằng tài nguyên không được quản lý được phát hành theo phương pháp Dispose hoặc bằng cách hoàn thành đối tượng.

0

Bộ thu gom rác phát hành MEMORY và dọn dẹp - thông qua bố trí - loại bỏ nó sẽ loại bỏ. NHƯNG: CNTT chỉ làm như vậy khi nó có áp lực bộ nhớ.

Điều này rất ngu ngốc đối với các nguồn tài nguyên mà tôi có thể muốn phát hành chúng một cách rõ ràng. Lưu vào tập tin, ví dụ, được cho là: Mở tệp, ghi dữ liệu và đóng tệp, để nó có thể được sao chép bởi người dùng nếu muốn, KHÔNG đợi GC quay lại và giải phóng bộ nhớ cho đối tượng tệp, điều này có thể không xảy ra trong nhiều giờ.

0

Bạn chỉ cần lo lắng về tài nguyên quý giá. Hầu hết các đối tượng bạn tạo trong khi lập trình không phù hợp với danh mục này. Như bạn nói, người thu gom rác sẽ chăm sóc chúng.

Những gì bạn cần lưu tâm là các đối tượng triển khai IDisposable, đây là dấu hiệu cho thấy tài nguyên mà nó sở hữu là quý giá và không nên chờ chuỗi cuối cùng được dọn sạch. Thời gian duy nhất bạn cần thực hiện IDisposable là trên các lớp sở hữu một đối tượng thực hiện IDisposable (chẳng hạn như luồng tệp) hoặc b) tài nguyên không được quản lý.

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