使用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
接口。
它是如何运作的?
答案 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()
。在完成更改而不是在每次迭代期间调用该方法。