code_junkie

Is there a better deterministic disposal pattern than nested “using”s in C#?

Nov 10th, 2011
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. using (FileStream fs = new FileStream("c:file.txt", FileMode.Open))
  2. {
  3. using (BufferedStream bs = new BufferedStream(fs))
  4. {
  5. using (StreamReader sr = new StreamReader(bs))
  6. {
  7. // use sr, and have everything cleaned up when done.
  8. }
  9. }
  10. }
  11.  
  12. {
  13. FileStream fs("c:file.txt", FileMode.Open);
  14. BufferedStream bs(fs);
  15. StreamReader sr(bs);
  16. // use sr, and have everything cleaned up when done.
  17. }
  18.  
  19. using (FileStream fs = new FileStream("c:file.txt", FileMode.Open))
  20. using (BufferedStream bs = new BufferedStream(fs))
  21. using (StreamReader sr = new StreamReader(bs))
  22. {
  23. // all three get disposed when you're done
  24. }
  25.  
  26. using (StreamWriter w1 = File.CreateText("W1"))
  27. using (StreamWriter w2 = File.CreateText("W2"))
  28. {
  29. // code here
  30. }
  31.  
  32. using (FileStream fs = new FileStream("c:file.txt", FileMode.Open))
  33. using (BufferedStream bs = new BufferedStream(fs))
  34. using (StreamReader sr = new StreamReader(bs))
  35. {
  36. }
  37.  
  38. public void Dispose()
  39. {
  40. Exception ex = null;
  41.  
  42. try
  43. {
  44. sr.Dispose();
  45. }
  46. catch (Exception e)
  47. {
  48. ex = e;
  49. }
  50.  
  51. try
  52. {
  53. bs.Dispose();
  54. }
  55. catch (Exception e)
  56. {
  57. if (ex != null)
  58. {
  59. ex.InnerException = e;
  60. }
  61. else
  62. {
  63. ex = e;
  64. }
  65. }
  66.  
  67. try
  68. {
  69. fs.Dispose();
  70. }
  71. catch (Exception e)
  72. {
  73. if (ex != null)
  74. {
  75. if (ex.InnerException != null)
  76. {
  77. ex.InnerException.InnerException = e;
  78. }
  79. else
  80. {
  81. ex.InnerException = e;
  82. }
  83. }
  84. else
  85. {
  86. ex = e;
  87. }
  88. }
  89.  
  90. if (ex != null)
  91. {
  92. throw ex;
  93. }
  94. }
  95.  
  96. using (FileStream fs = new FileStream("c:file.txt", FileMode.Open))
  97. using (BufferedStream bs = new BufferedStream(fs))
  98. using (StreamReader sr = new StreamReader(bs))
  99. {
  100. // use sr, and have everything cleaned up when done.
  101. }
  102.  
  103. FileStream fs = new FileStream("c:file.txt", FileMode.Open);
  104. BufferedStream bs = new BufferedStream(fs);
  105. StreamReader sr = new StreamReader(bs);
  106. try
  107. {
  108. // use sr, and have everything cleaned up when done.
  109. }finally{
  110. sr.Close(); // should be enough since you hand control to the reader
  111. }
  112.  
  113. using (StreamWrapper wrapper = new StreamWrapper("c:file.txt", FileMode.Open))
  114. {
  115. // do stuff using wrapper.Reader
  116. }
  117.  
  118. private class StreamWrapper : IDisposable
  119. {
  120. private readonly FileStream fs;
  121. private readonly BufferedStream bs;
  122. private readonly StreamReader sr;
  123.  
  124. public StreamWrapper(string fileName, FileMode mode)
  125. {
  126. fs = new FileStream(fileName, mode);
  127. bs = new BufferedStream(fs);
  128. sr = new StreamReader(bs);
  129. }
  130.  
  131. public StreamReader Reader
  132. {
  133. get { return sr; }
  134. }
  135.  
  136. public void Dispose()
  137. {
  138. sr.Dispose();
  139. bs.Dispose();
  140. fs.Dispose();
  141. }
  142. }
  143.  
  144. using (Stream Reader sr = new StreamReader( new BufferedStream( new FileStream("c:file.txt", FileMode.Open))))
  145. {
  146. // all three get disposed when you're done
  147. }
  148.  
  149. const string fname = @"c:1.xml";
  150.  
  151. StreamReader sr=new StreamReader(new BufferedStream(new FileStream(fname,FileMode.Open,FileAccess.Read,FileShare.Delete)));
  152. textBox1.Text = sr.ReadToEnd();
  153.  
  154. try
  155. {
  156. obj declaration
  157. ...
  158. }
  159. finally
  160. {
  161. obj.Dispose();
  162. }
Add Comment
Please, Sign In to add comment