在构造函数中使用

时间:2014-01-15 11:50:28

标签: c# stream using

我正在为转换器的构造函数使用create方法。

public void loadData()
{
    byte [] data = new byte [] {......}; // some byte data in here
    var converter = GetDataConverter(data);
}

现在在GetDataConverter里面我需要从二进制数据创建一个内存流(转换器是第三方并且需要一个流) 如果我像这样编写GetDataConverter,我会收到一个错误,告诉我我没有处理我理解的内容。我创建了一个MemoryStream,我需要处理。

public MyDataConverter GetDataConverter(byte [] data)
{
    return new MyDataConverter(new MemoryStream(data));
}

所以我的解决方案就是这样:

public MyDataConverter GetDataConverter(byte [] data)
{
    using(var ms = new MemoryStream(data))
    {
       return new MyDataConverter(ms);
    }
}

问题是,我的解决方案是否正确?我应该在这里使用'使用'吗?是不是'使用'会破坏我的内存流一旦它超出范围,所以转换器将没有任何工作?

我需要一个答案和一个解释,我在整个'使用'这里有点模糊。

由于

2 个答案:

答案 0 :(得分:0)

这实际上取决于MyDataConverter的实施。如果仅在构造函数内部使用MemoryStream来从中检索某些数据,那么使用using的解决方案就可以了。 如果,OTOH,MyDataConverter保留对MemoryStream的引用以便稍后访问它,则不得在此处置它。

答案 1 :(得分:0)

如果您无法访问'MyDataConverter'代码并且该类型未实现'IDisposable',您可以这样做:

public void loadData()
{
    byte[] data = new byte[] { 0 }; // some byte data in here

    using (var stream = new MemoryStream(data))
    {
        var converter = new MyDataConverter(stream);

        // do work here...
    }
}

如果您必须多次使用并希望重复使用代码,则可以执行以下操作:

public void loadData()
{
    byte[] data = new byte[] { 0 }; // some byte data in here

    UsingConverter(data, x =>
    {
        // do work here...
    });
}

void UsingConverter(byte[] data, Action<MyDataConverter> action)
{
    using (var stream = new MemoryStream(data))
    {
        var converter = new MyDataConverter(stream);

        action(converter);
    }
}