如何"使用"声明应该工作?

时间:2014-04-25 20:21:35

标签: c# .net using

我试图利用以下代码中的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();

然而,这并没有编译。为什么呢?

3 个答案:

答案 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 
}