2011-09-21 54 views
7

Theo lời khuyên của Phân tích Mã trong VS để gọi Dispose trên một đối tượng (mà tôi đã không previuosly) tôi đã kết thúc với một phương pháp chứa này:Vứt bỏ một HtmlControl

using (var favicon = new HtmlLink 
         { 
          Href = "~/templates/default/images/cc_favicon.ico" 
         }) 
{ 
    favicon.Attributes.Add("rel", "shortcut icon"); 
    Header.Controls.Add(favicon); 
} 

này nhầm lẫn cho tôi một chút, nếu Tôi vứt bỏ đối tượng này sau khi thêm nó vào bộ sưu tập Điều khiển là một ý tưởng hay?

Tính năng này vẫn hoạt động như thế nào? Có phải vì phương thức Controls.Add đã hủy bỏ đối tượng sau khi sử dụng như trái ngược với việc giữ nó không?

+2

R # thực sự đề nghị bạn nên vứt bỏ 'HtmlLink'? Bạn có thể chụp màn hình đó? Điều đó không được phép xảy ra. – bzlm

+0

@ bzlm, tôi sẽ nói lại, nó mang lại cho tôi tùy chọn để cấu trúc lại thành sử dụng, xin lỗi vì sự nhầm lẫn. – Mantorok

+1

thì mối quan tâm của bạn là chính xác.Bạn không nên vứt bỏ các điều khiển ASP.NET Web Form mà bạn thêm vào bộ sưu tập điều khiển. Và như một lưu ý chung, các tùy chọn được cung cấp bởi R # không phải lúc nào cũng được áp dụng; bạn nên sử dụng chúng một cách thận trọng. :) Nếu bạn thử alt-nhập vào rất nhiều thứ khác nhau trong mã của bạn, bạn sẽ nhanh chóng nhận thấy rằng điều này là như vậy. – bzlm

Trả lời

2

tôi sẽ nói rằng mã này không nên làm việc nhưng nếu bạn nói nó làm việc thì điều duy nhất tôi có thể nghĩ đến là:

  • Header.Controls.Add thêm bản sao của đối tượng để không có vấn đề xử lý bản gốc.
  • Phương pháp Vứt bỏ không làm sạch bất cứ thứ gì được sử dụng sau này.

Hy vọng điều này sẽ hữu ích.

+3

nó là thứ hai Thêm không sao chép các đối tượng –

+0

Không chắc chắn tại sao một người nào đó downvoted tôi . Tôi muốn tranh luận tại sao bạn nghĩ câu trả lời của tôi là không chính xác. Xin vui lòng cho tôi biết. –

+0

Tôi không downvote bạn nhưng đoán DV có thể là do viên đạn đầu tiên là không chính xác –

1

Nếu một phương pháp trên favicon được gọi là sử dụng bất kỳ tài nguyên không được quản lý, nó sẽ đưa ra ngoại lệ.

Từ MSDN:

Bạn có thể nhanh chóng các đối tượng tài nguyên và sau đó vượt qua các biến để báo cáo kết quả sử dụng, nhưng đây không phải là một thực hành tốt nhất. Trong trường hợp này, đối tượng vẫn nằm trong phạm vi sau khi điều khiển rời khỏi khối sử dụng ngay cả mặc dù nó có thể sẽ không còn quyền truy cập vào tài nguyên không được quản lý . Nói cách khác, nó sẽ không còn được khởi tạo đầy đủ nữa. Nếu bạn cố gắng sử dụng đối tượng bên ngoài khối sử dụng, bạn có thể gây ra một ngoại lệ để được ném. Vì lý do này, nói chung là tốt hơn để khởi tạo đối tượng trong câu lệnh sử dụng và giới hạn phạm vi của nó thành khối sử dụng.

using statement msdn

+0

Điều này là thú vị, bởi vì mọi điều khiển đều có phương thức Render trong ASP.Net, vậy làm sao nó đạt được điều đó trên một đối tượng được xử lý? – Mantorok

+0

Vâng, bạn chỉ là may mắn nếu nó vẫn hoạt động. Nó có thể phá vỡ bất kỳ cập nhật hoặc thay đổi sau này. – Peter

+1

Bạn có nghĩ rằng Code Analysis biết điều đó không? Hay nó chỉ là may mắn !? – Mantorok

0

Tôi giả định rằng bạn phân tích mã đã cung cấp cho bạn CA2000: Dispose objects before losing scope trước khi bạn thay đổi mã. Vấn đề là bạn không nên vứt bỏ đối tượng của bạn bởi vì bạn muốn sử dụng nó ngay cả sau khi trở về từ phương thức (nó đã được thêm vào một bộ sưu tập).

Bạn có thể ngăn chặn thư đó bằng SuppressMessage attribute hoặc bạn có thể viết lại bạn mã để được thực sự hoang tưởng:

var favicon = new HtmlLink { Href = "~/templates/default/images/cc_favicon.ico" }; 
try { 
    favicon.Attributes.Add("rel", "shortcut icon"); 
} 
catch { 
    favicon.Dispose(); 
    throw; 
} 
Header.Controls.Add(favicon); 

Dòng chảy bình thường của mã này cho biết thêm favicon vào bộ sưu tập mà là sau đó chịu trách nhiệm xử lý nó. Tuy nhiên, dòng chảy bất thường nơi favicon.Attributes.Add ném một ngoại lệ sẽ xử lý favicon trước khi truyền bá ngoại lệ.

Trong hầu hết các trường hợp, vì trình thu gom rác sẽ thực hiện công việc cuối cùng, bạn không cần phiên bản mã hoang tưởng.

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