【问题标题】:Using using in a constructor在构造函数中使用 using
【发布时间】:2014-01-15 11:50:28
【问题描述】:

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

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

现在在 GetDataConverter 中,我需要从二进制数据创建一个内存流(转换器是第 3 方并采用流) 如果我像这样编写 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);
    }
}

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

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

谢谢

【问题讨论】:

  • C# using statement 的可能重复项
  • “MyDataConverter”应该实现“IDisposable”并负责处理“MemoryStream”。
  • @vape:那个并没有真正回答我的问题。我想知道如果我在构造函数周围调用它,“使用”将如何影响我的转换器的其余部分。
  • @user3177615 使用 Alessandro 建议的解决方案(实际上我认为值得作为答案发布)
  • @user3177615 因为它使用一次性资源。当不再需要资源时,资源用户有责任清理该资源。经验法则如下 - 如果您的班级使用 IDisposable 资源,那么班级也应该是 IDisposable

标签: c# stream using


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2014-09-10
      • 2017-04-01
      相关资源
      最近更新 更多