Це питання оптимізації споживання пам'яті та оптимізації порівняння рядків. Щоразу, коли ви використовуєте порожній рядок у своїй програмі, ви виділяєте об'єкт рядка, що містить 0 символів. Що стосується порівняння рядків, то це можна зробити, порівнявши посилання (покажчики) замість символу за символом, що швидше навіть для порожніх рядків.
Якщо ви багато разів використовуєте один і той же рядок у вашій програмі, ви можете використовувати один і той же механізм, зателефонувавши String.Intern () зі своєю рядком. Але якщо ви використовуєте кожен рядок лише один раз, тоді ви будете використовувати лише більше пам'яті.
Тож String.Empty - це лише спеціальна оптимізація випадку, яку варто зробити для більшості застосунків .Net, тому вона була інтегрована в BCL.
Більш детально з цього приводу я настійно рекомендую ознайомитись із повідомленням у блозі Еріка Ліпперта .
Ви також повинні ознайомитися з цією документацією, на яку посилається його допис у блозі.