автоматическое удаление объектов, созданных в вызовах функций - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть серия перегрузок Read () в классе.Каждый открывает файл достаточно долго, чтобы прочитать, поэтому у меня есть:

public void Read(blah)
{
    using (FileStream stream = new FileStream(Path, FileMode.Open, FileAccess.Read))
    using (BinaryReader reader = new BinaryReader(stream))
    {
        //read some stuff        
    }
}

public void Read(blah blah)
{
    using (FileStream stream = new FileStream(Path, FileMode.Open, FileAccess.Read))
    using (BinaryReader reader = new BinaryReader(stream))
    {
        //read some different stuff        
    }
}

Есть ли способ обернуть создание потока и чтения в функцию, но при этом все еще сохраняются с помощью using () для автоматического удаления всего?например,

public void Read(blah)
{
    using (var reader = GetReader())
    {
        //read some stuff        
    }
}

public void Read(blah blah)
{
    using (var reader = GetReader())
    {
        //read some different stuff        
    }
}

private BinaryReader GetReader()
{
    //How do I dispose this stream?
    FileStream stream = new FileStream(Path, FileMode.Open, FileAccess.Read))

    return new BinaryReader(stream);
}

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

В этом конкретном случае вам не нужно утилизировать ваш поток.При утилизации BinaryReader автоматически удалит базовый поток.

Но, может быть, BinaryReader является лишь примером?

1 голос
/ 01 декабря 2011

В этом конкретном случае BinaryReader отвечает за переданный поток и правильно закрывает его при утилизации.

Если, тем не менее, вы хотите избежать такого примера в будущем, полезным примером может служить следующее:

private class MyReader : BinaryReader, IDisposable
    {
        private readonly Stream _input;

        public MyReader(Stream input) : base(input)
        {
            _input = input;
        }

        void IDisposable.Dispose()
        {
            Dispose();
            _input.Dispose();
        }
    }
0 голосов
/ 01 декабря 2011

Поскольку использование - это просто сокращение для блока try-finally, вы можете сделать что-то вроде:


class Program
{
    static void Main(string[] args)
    {
        using (var b = GetReader())
        {
        }
    }

    static B GetReader()
    {
        using (var a = new A())
        {
            return new B(a);
        }
    }
}

class A : IDisposable
{

    public void Dispose()
    {
        Console.WriteLine("Dispose A");
    }
}

class B : IDisposable
{
    public B(object obj)
    {
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose B");
    }
}

В вашем случае:


public void Read(blah)
{
    using (var reader = GetReader())
    {
        //read some stuff        
    }
}

public void Read(blah blah)
{
    using (var reader = GetReader())
    {
        //read some different stuff        
    }
}

private BinaryReader GetReader()
{
    //How do I dispose this stream?
    using(FileStream stream = new FileStream(Path, FileMode.Open, FileAccess.Read))
    {
        return new BinaryReader(stream);
    }
}
...