คำถามติดแท็ก idisposable

IDisposable คืออินเทอร์เฟซภายใน Base Class Library (BCL) ของ Microsoft .NET Framework มีวัตถุประสงค์เพื่อจัดเตรียมวิธีการทั่วไปที่กำหนดได้ในการปล่อยทรัพยากรที่ไม่มีการจัดการภายในรหัสแอปพลิเคชัน. NET

19
การใช้อินเตอร์เฟส IDisposable อย่างเหมาะสม
ฉันรู้จากการอ่านเอกสารของ Microsoftว่าการใช้IDisposableอินเทอร์เฟซหลักคือการล้างทรัพยากรที่ไม่มีการจัดการ สำหรับฉัน "ไม่มีการจัดการ" หมายถึงสิ่งต่าง ๆ เช่นการเชื่อมต่อฐานข้อมูลซ็อกเก็ตที่จับหน้าต่าง ฯลฯ แต่ฉันเห็นรหัสที่ใช้Dispose()วิธีการกับทรัพยากรที่มีการจัดการฟรีซึ่งดูเหมือนว่าซ้ำซ้อนกับฉันเนื่องจากตัวเก็บขยะควรดูแล สำหรับคุณ ตัวอย่างเช่น: public class MyCollection : IDisposable { private List<String> _theList = new List<String>(); private Dictionary<String, Point> _theDict = new Dictionary<String, Point>(); // Die, clear it up! (free unmanaged resources) public void Dispose() { _theList.clear(); _theDict.clear(); _theList = null; _theDict = …

13
การใช้วิธีจบ / กำจัดใน C #
C # 2008 ฉันทำงานนี้มาระยะหนึ่งแล้วและฉันยังสับสนเกี่ยวกับการใช้ขั้นตอนสุดท้ายและการกำจัดในโค้ด คำถามของฉันอยู่ด้านล่าง: ฉันรู้ว่าเราต้องการเครื่องมือขั้นสุดท้ายขณะที่ทิ้งทรัพยากรที่ไม่มีการจัดการ อย่างไรก็ตามหากมีการจัดการทรัพยากรที่โทรไปยังทรัพยากรที่ไม่มีการจัดการมันจะยังคงต้องใช้ตัวเลือกสุดท้าย อย่างไรก็ตามหากฉันพัฒนาคลาสที่ไม่ได้ใช้ทรัพยากรที่ไม่มีการจัดการไม่ว่าทางตรงหรือทางอ้อมฉันควรใช้IDisposableเพื่ออนุญาตให้ลูกค้าของคลาสนั้นใช้ 'การใช้คำสั่ง' หรือไม่ เป็นไปได้ไหมที่จะใช้ IDisposable เพียงเพื่อให้ลูกค้าในชั้นเรียนของคุณใช้คำสั่ง use using(myClass objClass = new myClass()) { // Do stuff here } ฉันได้พัฒนาโค้ดง่าย ๆ ด้านล่างนี้เพื่อสาธิตการใช้งานสุดท้าย / กำจัดทิ้ง: public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += …

12
HttpClient และ HttpClientHandler ต้องถูกกำจัดระหว่างการร้องขอหรือไม่?
System.Net.Http.HttpClientและSystem.Net.Http.HttpClientHandlerใน. NET Framework 4.5 ใช้ IDisposable (ผ่านSystem.Net.Http.HttpMessageInvoker ) usingเอกสารคำสั่งพูดว่า: ตามกฎแล้วเมื่อคุณใช้วัตถุ IDisposable คุณควรประกาศและสร้างอินสแตนซ์ในข้อความสั่งการใช้ คำตอบนี้ใช้รูปแบบนี้: var baseAddress = new Uri("http://example.com"); var cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) { var content = new …


10
ฉันควรกำจัด () ชุดข้อมูลและ DataTable หรือไม่
ชุดข้อมูลและ DataTable ใช้ทั้ง IDisposable ดังนั้นโดยวิธีปฏิบัติที่ดีที่สุดฉันควรเรียกวิธีการ Dispose () ของพวกเขา อย่างไรก็ตามจากสิ่งที่ฉันอ่านจนถึงขณะนี้ชุดข้อมูลและ DataTable ไม่มีทรัพยากรที่ไม่มีการจัดการดังนั้น Dispose () ไม่ได้ทำอะไรมากจริงๆ นอกจากนี้ฉันไม่สามารถใช้using(DataSet myDataSet...)เพราะชุดข้อมูลมีคอลเลกชัน DataTables ดังนั้นเพื่อความปลอดภัยฉันต้องทำซ้ำผ่าน myDataSet.Tables กำจัดแต่ละ DataTables จากนั้นกำจัด DataSet ดังนั้นมันจึงคุ้มค่าที่จะโทรหา Dispose () ใน DataSets และ DataTables ของฉันทั้งหมดหรือไม่ ภาคผนวก: สำหรับผู้ที่คิดว่าควรกำจัดชุดข้อมูล: โดยทั่วไปแล้วรูปแบบการกำจัดคือการใช้งานusingหรือtry..finallyเนื่องจากคุณต้องการรับประกันว่าจะเรียก Dispose () อย่างไรก็ตามสิ่งนี้ได้รับความรวดเร็วอย่างน่าเกลียดสำหรับคอลเลกชัน ตัวอย่างเช่นคุณจะทำอย่างไรหากหนึ่งในสายที่จะทิ้ง () โยนข้อยกเว้น? คุณกลืน (ซึ่งเป็น "เลว") เพื่อที่คุณจะสามารถกำจัดองค์ประกอบต่อไปได้หรือไม่ หรือคุณแนะนำให้ฉันโทร myDataSet.Dispose () และลืมเกี่ยวกับการทิ้ง DataTables ใน …


5
จะ Dispose () ถูกเรียกใช้ใน statement ที่ใช้กับวัตถุ null หรือไม่?
มีความปลอดภัยในการใช้usingคำสั่งบนวัตถุ (อาจ) null หรือไม่? ลองพิจารณาตัวอย่างต่อไปนี้: class Test { IDisposable GetObject(string name) { // returns null if not found } void DoSomething() { using (IDisposable x = GetObject("invalid name")) { if (x != null) { // etc... } } } } มันรับประกันว่าDisposeจะถูกเรียกเฉพาะในกรณีที่วัตถุไม่เป็นโมฆะและฉันจะไม่ได้รับ a NullReferenceException?
179 c#  idisposable  using 

5
ฉันควรจะเรียก Close () หรือ Dispose () สำหรับวัตถุ stream หรือไม่
การเรียนการสอนเช่นStream, StreamReader, StreamWriterฯลฯ ดำเนินการIDisposableอินเตอร์เฟซ นั่นหมายความว่าเราสามารถเรียกDispose()ใช้เมธอดบนวัตถุของคลาสเหล่านี้ พวกเขายังได้กำหนดวิธีการที่เรียกว่าpublic Close()ทีนี้ฉันจะโทรไปหาอะไรเมื่อฉันทำกับวัตถุแล้ว ถ้าฉันโทรหาทั้งคู่ รหัสปัจจุบันของฉันคือ: using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { using (StreamWriter writer = new StreamWriter(filename)) { int chunkSize = 1024; while (!reader.EndOfStream) { char[] buffer = new char[chunkSize]; int count = reader.Read(buffer, 0, chunkSize); if (count != …

9
พนักงานเก็บขยะจะโทรหา IDisposable ทิ้งให้ฉันไหม
NET IDisposable Pattern หมายความว่าหากคุณเขียน Finalizer และใช้ IDisposable โปรแกรมสุดท้ายของคุณจะต้องเรียก Dispose อย่างชัดเจน นี่เป็นเหตุผลและเป็นสิ่งที่ฉันทำมาโดยตลอดในสถานการณ์ที่หายากซึ่งมีการรับประกันขั้นสุดท้าย อย่างไรก็ตามจะเกิดอะไรขึ้นถ้าฉันทำสิ่งนี้: class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } และอย่าใช้โปรแกรมปิดท้ายหรืออะไรเลย เฟรมเวิร์กจะเรียกเมธอด Dispose ให้ฉันหรือไม่ ใช่ฉันรู้ว่านี่ฟังดูโง่และตรรกะทั้งหมดก็บอกเป็นนัยว่ามันจะไม่เกิดขึ้น แต่ฉันมักจะมี 2 สิ่งที่ด้านหลังศีรษะซึ่งทำให้ฉันไม่แน่ใจ เมื่อสองสามปีก่อนเคยบอกฉันว่ามันจะทำได้จริงและคน ๆ นั้นมีประวัติที่มั่นคงมากว่า "รู้เรื่องของพวกเขา" คอมไพเลอร์ / เฟรมเวิร์กทำสิ่ง 'เวทมนตร์' อื่น ๆ ขึ้นอยู่กับอินเทอร์เฟซที่คุณใช้ (เช่น foreach, extension method, serialization ตามคุณสมบัติ ฯลฯ ) …

7
คุณจะป้องกัน IDisposable จากการแพร่กระจายไปยังชั้นเรียนทั้งหมดของคุณได้อย่างไร
เริ่มด้วยคลาสที่เรียบง่ายเหล่านี้ ... สมมติว่าฉันมีชุดเรียนที่เรียบง่ายเช่นนี้: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } BusมีDriverที่DriverมีสองShoes แต่ละมีShoe Shoelaceทั้งหมดโง่มาก เพิ่มวัตถุ IDisposable ใน Shoelace ต่อมาฉันตัดสินใจว่าการดำเนินการบางอย่างเกี่ยวกับShoelaceอาจเป็นหลายเธรดดังนั้นฉันจึงเพิ่มEventWaitHandleสำหรับเธรดที่จะสื่อสารด้วย …

5
จะเกิดอะไรขึ้นถ้าฉันกลับมาก่อนสิ้นสุดการใช้งานคำสั่ง? จะเรียกขายทิ้งหรือไม่
ฉันมีรหัสต่อไปนี้ using(MemoryStream ms = new MemoryStream()) { //code return 0; } dispose()วิธีการที่เรียกว่าในตอนท้ายของusingคำสั่งวงเล็บ}ใช่มั้ย? เนื่องจากฉัน returnก่อนสิ้นสุดusingคำสั่งMemoryStreamวัตถุจะถูกกำจัดอย่างถูกต้องหรือไม่? เกิดอะไรขึ้นที่นี่?

7
เราจะทราบได้อย่างไรว่าการอ้างอิงวัตถุที่ระบุได้ถูกกำจัดทิ้งไป?
มีวิธีการหรือวิธีอื่นที่มีน้ำหนักเบาในการตรวจสอบว่ามีการอ้างอิงถึงวัตถุที่กำจัดทิ้งหรือไม่? PS - นี่เป็นเพียงความอยากรู้อยากเห็น (หลับให้สบายไม่ใช่รหัสการผลิต) ใช่ฉันรู้ว่าฉันสามารถจับได้ObjectDisposedExceptionเมื่อพยายามเข้าถึงสมาชิกของวัตถุ
88 c#  .net  dispose  idisposable 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.