В чём разница между string и String в C#?

Ответ на самом деле очень прост: string — это просто псевдоним (alias) для System.String т.е. технически, никакой разницы нет. Так же, как и нет разницы между int и System.Int32.

Что касается стиля оформления кода, то тут есть несколько советов.

Обычно рекомендуется использовать string, когда вы имеете в виду объект:

string name = "Jessica";

В противовес случаю, когда вам нужно обратиться именно к классу, например:

string msg = String.Format("Hi, {0}!", name);

По крайней мере этот тот стиль, которого придерживается Microsoft в своих примерах.

На картинке показан полный список псевдонимов. Единственный тип, который не имеет псевдонима — это System.IntPtr, его всегда нужно писать именно так.

v5Vy1oMn00Q

Однако есть один случай, когда нужно обязательно использовать псевдонимы: в явных объявлениях типа для перечисления:

public enum Foo : UInt32 {} // Неправильно
public enum Bar : uint {} // Правильно

Также рекомендуем вам относится с осторожностью к типам, когда вы реализуете какой-либо API, который может использоваться клиентами на других языках. Например, метод ReadInt32 вполне однозначен, тогда как ReadInt — нет. Тот, кто использует ваш API может пользоваться языком, в котором int является 16 или 64-битным, что не совпадает с вашей реализацией. Этому совету отлично следуют разработчики .Net Framework, хорошие примеры можно найти в классах BitConverter, BinaryReader и Convert.