Значение String.Empty будет расшифровано только во время выполнения, но с другой стороны значение "" известно во время самой компиляции.
Это единственная разница между этими двумя.
Но в соответствии с наилучшей практикой, если завтра M $ решит, что пустое строковое значение должно быть использовано как '' вместо "" по какой-то причине, тогда ваш код должен изменяться везде. Так что в этом случае лучше всего использовать String.Empty.
Это та же практика, что и в Path.Combine.