using array with array - type必须可以隐式转换为'System.IDisposable'

时间:2018-02-23 12:12:44

标签: c# asp.net .net arrays

使用using语句的以下代码旨在避免某种内存泄漏,这会导致代码在长文件上变慢:

var db = new EntityContext();
var cubos = db.CubosTrabalhados;
var cubo = new CuboTrabalhado();
string[] lines = File.ReadAllLines(Files.cuboHistorico, Encoding.Default);
bool header = true;
int i = 2;

foreach (string line in lines)
{
    if (header) header = false;
    else
    {
        using (var reg = line.Split(';'))
        {
            cubo.Pedido = reg[0];
            cubo.DataPedido = Select.ParseDate(reg[3]);
            cubo.Cliente = reg[4];
            cubo.UF = Select.Uf(reg[5]);
            cubo.Cidade = reg[6];
            cubo.Regiao = reg[7];
            cubo.Codigo = reg[8];
            cubo.Produto = reg[9];
            ...
            cubo.VlCom = Select.ParseFloat(reg[63]);
            cubo.Cnpj = reg[64];
            cubo.CodProdOriginal = reg[65];

            cubos.Add(cubo);
            db.SaveChanges(); 
        }
    }
}

但是带有using语句的行会出错:

  

'string []':using语句中使用的类型必须是隐式的   可转换为'System.IDisposable'

由于Split是.net的常规部分,因此我无法理解如何在这种情况下实现IDisposable接口。

它是如何运作的?

3 个答案:

答案 0 :(得分:8)

showModal() { this.setState({ modal: !this.state.modal }); } 返回Split,但未实现Array。在这种情况下你不能使用IDisposable,更不用了 - 你不需要。

答案 1 :(得分:4)

您只能对实现using的类型使用IDisposable - 语句。 string[]没有实现它,因为字符串是托管资源,因此垃圾收集器将清理所有内容。

  • 因此,如果您尝试使用数组,则无需编译。但是你应该总是处理真正实现EntityContext的{​​{1}}。
  • 还有另一个错误。您只有一个IDisposable实例,因为您在循环之前声明它,您想为CuboTrabalhado中的每个项创建一个。
  • 您可以在循环后调用string[]以提交所有更改,您无需在内部执行此操作
SaveChanges

答案 2 :(得分:2)

using语句是IDisposable接口和模式的执行部分。您的错误来自string[]不是传统意义上的类,更不是来自IDisposable的类。

using不会神奇地防止内存泄漏。它阻止它们的方式是它如何用作语法糖,使得在使用具有非托管资源的IDisposable对象时代码更易于读取和维护。一个例子是SqlCommand

using(var x = new SqlCommand("select gunk from someStuff", myDataConnection))
{
        x.Connection.Open();
        x.ExecuteQuery();
}

相同
var x = new SqlCommand("select gunk from someStuff", myDataConnection);
try
{
       x.Connection.Open();
       x.ExecuteQuery();
}
finally
{
      x.Connection.Close();
      x.Dispose(); 
}

正如您所看到的,using主要存在,因此您不必记住关闭/处置连接或对象,并使其范围在大块代码中更清晰。

你的性能缓慢可能是因为你在循环中捏造SaveChanges()。在完成更改而不是在每次迭代期间调用该方法。