Disposables, Using & Try/Catch Blocks

后端 未结 6 1377
一向
一向 2020-12-19 05:56

Having a mental block today, need a hand verifying my logic isn\'t fubar\'ed.

Traditionally I would do file i/o similar to this:

FileStream fs = null         


        
相关标签:
6条回答
  • 2020-12-19 06:11

    The using block will work exactly as you entend translated the using block is really just

    try
    {
       FileStream fs = null;
       try
       {
            fs = File.Open("Foo.txt", FileMode.Open))
            //Do Stuff
       }
       finally
       {
          if(fs != null)
              fs.Dispose();
       }
    }
    catch(Exception)
    {
       /// Handle Stuff
    }
    
    0 讨论(0)
  • 2020-12-19 06:16

    Don't worry, it will clean up as expected and is cleaner than your original.

    In fact it's much more common to have a try/finally aka using statement in your business logic, and a try/catch in a top-level handler in the UI tier or at a physical tier boundary. Something like:

    try
    {
        DoStuffWithFile("foo.txt");
    }
    catch(Exception ex)
    {
       ...
    }
    

    and

    public void DoStuffWithFile(string fileName)
    {
        using(FileStream fs = File.Open(fileName,...))
        {
            // Do Stuff
        }
    }
    
    0 讨论(0)
  • 2020-12-19 06:22

    This will work - internally the using statement compiles the same way as a try-finally block

    0 讨论(0)
  • 2020-12-19 06:27

    You're just being paranoid and it will work the way you intend it to :)

    A using statement is equivalent to a try/finally block, whether it's inside a try/catch or not.

    So your code is similar to:

    try
    {
       FileStream fs = null;
       try
       {
           fs = File.Open("Foo.txt", FileMode.Open);
           // Do stuff
       }
       finally
       {
           if (fs != null)
           {
               fs.Dispose();
           }
       }
    }
    catch(Exception)
    {
       /// Handle Stuff
    }
    
    0 讨论(0)
  • 2020-12-19 06:32
        try
        {
            FileStream fs = null;
            try
            {
               fs = File.Open("Foo.txt", FileMode.Open);
    
            }
            finally
            {
               fs.Dispose();
            }
        }
        catch(Exception)
        {
           /// Handle Stuff
        }
    

    second piece of code gets translated into this

    0 讨论(0)
  • 2020-12-19 06:32

    You don't need the try..finally if you have a using(). They perform the same operation.

    If you're not convinced, point Reflector at your assembly and compare the generated code.

    0 讨论(0)
提交回复
热议问题