C# 将语句与数组类型一起使用必须隐式转换为';System.IDisposable';

C# 将语句与数组类型一起使用必须隐式转换为';System.IDisposable';,c#,asp.net,.net,arrays,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; foreac

下面使用
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
语句的行给出了错误:

“字符串[]”:using语句中使用的类型必须隐式 可转换为“System.IDisposable”

由于
Split
是.net的常规部分,因此在这种情况下,我不知道如何实现
IDisposable
接口


它是如何工作的?

Split
返回一个
数组
,该数组不实现
IDisposable
。在这种情况下,您不能使用
using
,更何况-您不需要。

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

  • 因此,如果您尝试与数组一起使用,则它不是必需的,也不会编译。但是您应该始终处理真正实现了IDisposable的
    EntityContext
  • 还有一个错误。您只有一个
    CuboTrabalhado
    实例,因为您在循环之前声明了它,所以希望为
    字符串[]
    中的每个项创建一个实例
  • 您可以在循环后调用
    SaveChanges
    提交所有更改,而不需要在内部执行


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

使用
并不能神奇地防止内存泄漏。它阻止它们的方式是,当使用具有非托管资源的
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(); 
}
正如您所看到的,
使用
在很大程度上是存在的,这样您就不必记住关闭/处理连接或对象,并且在大代码块中使它们的范围更加清晰


您的性能低下可能是因为您在循环中反复使用
SaveChanges()
。完成更改后,而不是在每次迭代期间调用该方法。

只需使用删除
,拆分字符串时不会出现内存泄漏,除非您将对
reg
的引用保存在某个位置。您无需处理字符串数组。这是垃圾收集器
的工作,在这种情况下使用
是完全无用的。在这种情况下,需要处理的是DbContext,而不是字符串数组。它很慢,因为您要为每一行写入数据库。将db save更改放在for each循环之外。您已经跟踪了
cubos
var x = new SqlCommand("select gunk from someStuff", myDataConnection);
try
{
       x.Connection.Open();
       x.ExecuteQuery();
}
finally
{
      x.Connection.Close();
      x.Dispose(); 
}