L’istruzione using del C# è utilizzata per definire un ambito all’esterno del quale uno o più oggetti verranno eleminati.
L’oggetto fornito all’istruzione using deve necessariamente implementare l’interfaccia System.IDisposable (e, di conseguenza, il metodo Dispose, che rilascerà le risorse).
Si esce dall’ambito definito da using quando termina il blocco o in presenza di un’eccezione.

Una corretta implementazione del metodo Dispose prevede che questo debba ignorare tutte le chiamate successive alla prima e che non lanci un’eccezione in caso di chiamate multiple.

Vediamo un semplice esempio.
Consideriamo la seguente classe che implementa IDisposable:

MyClass.cs

using System;

namespace test
{
	public class MyClass : IDisposable
	{

		private bool disposed = false;

		public MyClass()
		{
			Console.WriteLine("MyClass -> MyClass()");
		}

		public void DoWork()
		{
			Console.WriteLine("MyClass -> DoWork()");
		}

		public void Dispose()
		{
			if(!disposed)
			{
				Console.WriteLine("MyClass -> Dispose()");
				disposed = true;
			}
		}
	}
}

Si noti il flag disposed, che ci consente un’unico rilascio delle risorse.
Di seguito, utilizzeremo un oggetto di questa classe con l’istruzione using:

UsingTest.cs

using System;

namespace test
{
	public class UsingTest
	{
		public static void Main(String[] args)
		{
			using(MyClass obj1 = new MyClass(),
					obj2 = new MyClass())
			{
				obj1.DoWork();
			}
		}
	}
}

L’output del programma sarà il seguente:

MyClass -> MyClass()
MyClass -> MyClass()
MyClass -> DoWork()
MyClass -> Dispose()
MyClass -> Dispose()