C# 在构造函数中使用

C# 在构造函数中使用,c#,stream,using,C#,Stream,Using,我正在为转换器的构造函数使用create方法 public void loadData() { byte [] data = new byte [] {......}; // some byte data in here var converter = GetDataConverter(data); } 现在,在GetDataConverter中,我需要从二进制数据创建一个memorystream,该转换器是第三方的,并接受一个流 如果我像这样编写GetDataConverte

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

public void loadData()
{
    byte [] data = new byte [] {......}; // some byte data in here
    var converter = GetDataConverter(data);
}
现在,在GetDataConverter中,我需要从二进制数据创建一个memorystream,该转换器是第三方的,并接受一个流 如果我像这样编写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);
    }
}
问题是,我的解决方案正确吗?我应该在这里使用“using”吗?一旦内存流超出范围,“使用”不会破坏它吗?这样转换器就没有工作了

我需要一个答案和一个解释,我对整个“使用”的事情有点模糊


谢谢

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

如果您无法访问“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”的可能副本应该实现“IDisposable”,并负责处理“MemoryStream”。@vape:那个并不能真正回答我的问题。我想知道如果我在构造函数中调用“using”将如何影响我的转换器的其余部分。@user3177615使用Alessandro建议的解决方案实际上我认为值得发布为answer@user3177615因为它使用一次性资源。当不再需要资源时,资源用户有责任清理该资源。经验法则如下-若您的类使用IDisposable资源,那个么该类也应该是IDisposable的