System.Stringクラスでは、インデックスは0から始まります(0-based)。 例えば"ABC"という文字列の場合、Aのインデックスは0になります(1ではなく)。 つまり配列におけるインデックスと同様になります。 Stringクラスの文字列操作メソッドでは、配列同様にインデックスを0から始まるものとして扱います。

文字列操作とインデックス
using System;

class Sample {
  static void Main()
  {
    var s = "The quick brown fox jumps over the lazy dog";

    // インデックス0の文字(文字列sの1文字目)を表示する
    Console.WriteLine(s[0]);

    // インデックス4から5文字分を切り出して表示する
    Console.WriteLine(s.Substring(4, 5));

    // 部分文字列"quick"がある位置のインデックスで取得して表示する
    Console.WriteLine(s.IndexOf("quick"));
  }
}
実行結果
T
quick
4

インデックスの扱いは、C#やVBといった言語の違いに関わらず、.NET Frameworkですべて共通しています。 なお、Visual Basic 6までは文字列のインデックスは1から始まる(1-based)とされているため、LenInStrといったVBの文字列関数を使ったコードを移植する場合は特に注意が必要です。

n文字目という表記とインデックスの対応について注意を要する場合があります。 例えば、1文字目という表記が文字列のインデックス0を表す場合もあれば、文字の位置とインデックスを対応させるために0文字目と表記してインデックス0を指す場合もあります。 一般には前者であることが多いようですが、ドキュメントや文脈によっては後者が用いられる場合もあります。

VB.NETでも引き続きLen等のVB由来の文字列関数を使用し続けることはできます。 また、一般的には推奨されませんが、C#でもこれらの関数を使うことはできます。 詳しくはVBの文字列関数を参照してください。