If the type implements IDisposable, it automatically disposes that type.
Given:
public class SomeDisposableType : IDisposable
{
...implmentation details...
}
These are equivalent:
SomeDisposableType t = new SomeDisposableType();
try {
OperateOnType(t);
}
finally {
if (t != null) {
((IDisposable)t).Dispose();
}
}
using (SomeDisposableType u = new SomeDisposableType()) {
OperateOnType(u);
}
The second is easier to read and maintain.
Since C# 8 there is a new syntax for using
that may make for more readable code:
using var x = new SomeDisposableType();
It doesn't have a { }
block of its own and the scope of the using is from the point of declaration to the end of the block it is declared in. It means you can avoid stuff like:
string x = null;
using(var someReader = ...)
{
x = someReader.Read();
}
And have this:
using var someReader = ...;
string x = someReader.Read();
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…