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