準備
(なし)
デザイン
1. フォーム (Form1) にボタン (button1) を配置します。
2. フォーム (Form1) にリストボックス (listBox1) を配置します。
サンプルコード (C#)
// 名前空間の追加
// (なし)
// コード
private void button1_Click(object sender, EventArgs e)
{
  int v1 = 0;
  TestFunc1(v1);
  listBox1.Items.Add(v1);
  
  int v2 = 0;
  TestFunc2(ref v2);
  listBox1.Items.Add(v2);
  
  int v3;
  TestFunc3(out v3);
  listBox1.Items.Add(v3);
}
private void TestFunc1(int v1)
{
  v1++;
}
private void TestFunc2(ref int v2)
{
  v2++;
}
private void TestFunc3(out int v3)
{
  v3 = 0;
  v3++;
}
解説
TestFunc1 には、値渡しで変数を渡しています。渡された変数をメソッドの中でインクリメントしていますが、それは呼び出し元には全く影響しません。従って、出力結果は 0 となります。
TestFunc2 には、参照渡しで変数を渡しています。その際に使用しているキーワードは ref です。呼び出す側と呼び出される側双方に ref を付ける必要があります。渡された変数をメソッドの中でインクリメントしており、それが呼び出し元にも反映されます。従って、出力結果は 1 になります。
TestFunc3 にも、参照渡しで変数を渡しています。その際に使用しているキーワードは out です。呼び出す側と呼び出される側双方に out を付ける必要があります。渡された変数をメソッドの中で、一度初期化してから、インクリメントしており、それが呼び出し元にも反映されます。従って、出力結果は 1 になります。
ref と out の違いですが、変数の初期化が事前に必要かどうかが違いです。ref で変数を渡す場合には事前に初期化の必要があります。out で変数を渡す場合には、呼び出されたメソッドの中で変数の初期化を行うことができ、事前の初期化は不要です。そのために、TestFunc3 の中で一度初期化してからインクリメントしています。
結果

動作確認環境
Visual Studio 2015 Professional (C# 6.0)