Using 使い方は4種類

基本文法

Usingディレクティブ

使用する側のコードと同じ名前空間に定義されたクラスなどはそのまま使うことができます。
異なる名前空間に定義されている場合は「名前空間 + クラス名」といった完全修飾名を必要とします。
逐一記述するのも大変なのでファイル冒頭に使用可能な名前空間を列挙するために使います。

using System.IO;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] directories = Directory.GetDirectories(@"c:\test");

            // using ディレクティブの記述がない場合は以下のように完全修飾名が必要
            //string[] directories = System.IO.Directory.GetDirectories(@"c:\test");
        }
    }
}

Usingエイリアスディレクティブ

名前空間が異なるがクラス名が同じ場合にエイリアス(別名)を付与するために使う。

namespace Sample
{
    // 名前空間を指定
    using AAA = NS_AAA;
    using BBB = NS_BBB;

    class Program
    {
        static void Main(string[] args)
        {
            // NS_AAA名前空間にあるSameクラスが使われる
            int val = AAA.Same.Value;
        }
    }
}
namespace NS_AAA
{
    public static class Same
    {
        public static int Value => 10;
    }
}

namespace NS_BBB
{
    public static class Same
    {
        public static int Value => 20;
    }
}

Using静的ディレクティブ

クラス名を指定することなく静的メンバのようにアクセスできるようになる。
C#6.0から追加された文法。

namespace Sample
{
    // 名前空間とクラス名とを指定
    using static NS_CCC.Calc;

    class Program
    {
        static void Main(string[] args)
        {
            // クラス名の指定をせずに他クラスの静的メンバを使える
            int val = Add(3, 4);
        }
    }
}

namespace NS_CCC
{
    public static class Calc
    {
        public static int Add(int x, int y) => x + y;
    }
}

Usingステートメント

使い終わったオブジェクトは、ガベージコレクションにより自動で破棄されます。 しかし、ファイルアクセスやデータベースアクセスのように終了処理を明示的に行ってほしい場合があります。 そういう場合に使われる文法です。
処理を実装する側はDisposeメソッドが一つだけ定義されているIDisposableインタフェースを実現(継承)して定義します。
IDisposableインタフェースを実現(継承)しているクラスを使用する方は、使用後はDisposeメソッドを忘れず呼ぶことを強制されています。
処理中に例外が発生することを考慮すればtry-fainallyで実装する必要がありますが、これと同じことをやってくれるのがUsingステートメントです。

using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // 普通に書くとこうなる
        StreamWriter writer = null;

        try
        {
            writer = new StreamWriter(@"C:\test.txt");
            // 通常処理
        }
        catch 
        {
            // 例外処理
        }
        finally
        {
            writer?.Dispose();
        }

        // 上と全く同じことをやってくれる。
        // (usingから抜ける時に必ずDisposeメソッドが呼ばれる)
        //using (var writer = new StreamWriter(@"C:\test.txt"))
        //{

        //}
    }
}