我试图利用以下代码中的using
语句:
Uri uri = new Uri("http://localhost:50222/odata");
var container = new CourseServiceRef.Container(uri);
CourseServiceRef.NotNeeded newTempUser = new CourseServiceRef.NotNeeded()
{
Email = model.UserName,
Username1 = model.UserName
};
container.AddToNotNeededs(newTempUser);
container.SaveChanges();
然而,这并没有编译。为什么呢?
答案 0 :(得分:9)
using
statement - 不要与using
directive混合 - 适用于实现IDisposable
interface的对象,以便在代码块的末尾自动处理它们:
using (var toto = new MyDisposableClass())
{
// do stuff
}
如果您的任何类确实实现了此接口(或继承了该接口),您可以使用上述语法来确保调用Dispose()
方法。对于没有实现此接口的对象,您不能使用using
块,它只是无法编译。
基本上,这将与以下相同:
var toto = new MyDisposableClass()
try
{
// do stuff
}
finally
{
if (toto != null) ((IDisposable)toto).Dispose();
}
这里唯一的区别是,在第一个场景中,toto
的范围在using
块的末尾消失。
答案 1 :(得分:3)
“使用”的目的是确保在实现IDisposable的对象上调用Dispose()。因此,在代码中使用关键字的最佳方式是,与任何其他代码一样,在实现IDisposable的对象上。例如,这可能是您的“newTempUser”或您的“容器”。由于我们无法访问他们的定义,因此只有您可以回答这个问题。
答案 2 :(得分:1)
using
的使用并没有真正好坏。要么你使用它,要么你没有。如果在实例化实现IDisposable
的类时没有使用它,那么你可能犯了一个错误(除非你有充分的理由在别处调用Dispose
,这只是用例的很小一部分)。
如果您未能使用它,那么处理资源的时间点就不太可预测,并且可能会对您的应用程序性能产生负面影响。没有不同的使用方式,只有一种;
using (ClassImplementigIDisposable instance = new ClassImplementigIDisposable())
{
// code that uses instance
// at the end of this block `Dispose` will be called on instance
}