在构造函数中使用 using



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

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

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

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);
    }
}

问题是,我的解决方案正确吗?我应该在这里使用"使用"吗?一旦超出范围,"使用"不会破坏我的内存流,因此转换器将无事可做吗?

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

谢谢

如果您无法访问"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);
    }
}

这实际上取决于MyDataConverter的实现。如果 MemoryStream 仅在构造函数内部用于从中检索一些数据,则具有 using 的解决方案是可以的。如果OTOH MyDataConverter保留对MemoryStream的引用以便以后访问它,则不得在此处处理它。

相关内容

  • 没有找到相关文章

最新更新