Почему предпочтительно использовать String.Empty в C # и, следовательно, общедоступную константу в других языках, заключается в том, что константы являются статическими, поэтому занимают только один экземпляр в памяти.
Каждый раз, когда вы делаете что-то вроде этого: -
stringVariable = "";
вы создаете новый экземпляр пустой строки и указываете на него с помощью stringVariable.
Таким образом, каждый раз, когда вы присваиваете переменной (указателю) значение «», эта «» пустая строка является новым экземпляром строки, пока у нее больше не будет указателя.
Инициализация строк путем указания их всех на одну и ту же константу означает, что когда-либо создается только одно "", и каждая инициализированная переменная указывает на одну и ту же пустую строку.
Это может звучать тривиально, но создание и уничтожение строк гораздо более ресурсоемко, чем создание указателей (переменных) и указание их на существующую строку.
Поскольку инициализация строки распространена, рекомендуется сделать следующее: -
const String EMPTY_STRING = "";
String variable1 = EMPTY_STRING;
String variable2 = EMPTY_STRING;
String variable3 = EMPTY_STRING;
String variable4 = EMPTY_STRING;
String variable5 = EMPTY_STRING;
Вы создали 5 строковых указателей, но только 1 строку
вместо: -
String variable1 = "";
String variable2 = "";
String variable3 = "";
String variable4 = "";
String variable5 = "";
Вы создали 5 строковых указателей и 5 отдельных нулевых строк.
Не является серьезной проблемой в этом случае, но в тысячах строк кода в десятках классов это излишняя трата памяти и использование процессора, создание другой переменной с нулевой строкой, когда все они могут указывать на одну и ту же, делая приложения гораздо эффективнее.
Конечно, компиляторы должны быть достаточно умными, чтобы определять несколько статических строк и повторно использовать дубликаты, но зачем предполагать?
Кроме того, он менее подвержен ошибкам, так как "" и "" оба компилируются, но вы можете пропустить случайно добавленное место, которое может привести к ложным ошибкам времени выполнения, например, условной логике, такой как: -
myvariable = " ";
While (myVariable == ""){
...
}
Код внутри блока while недоступен, поскольку myVariable не будет удовлетворять условию на первой итерации. Ошибка инициализации с "" вместо "" легко пропустить, тогда как: -
myvariable = EMPTY_STRING;
While (myVariable == EMPTY_STRING){
...
}
... менее вероятно, приведет к ошибкам во время выполнения, особенно из-за того, что неправильное написание EMPTY_STRING вызовет ошибку компиляции вместо того, чтобы отлавливать ошибку во время выполнения.
Самое чистое решение - создать статический класс, содержащий члены всех типов строковых констант, которые вам нужны, если вам требуется больше, чем просто пустая строка.
public static class StringConstants{
public static String Empty = "";
public static String EMail = "mailto:%s";
public static String http = "http://%s";
public static String https = "https://%s";
public static String LogEntry = "TimeStamp:%tYmdHMSL | LogLevel:%s| Type:%s | Message: '%s'";
}
String myVariable = StringConstants.Empty;
Вы даже можете расширить собственный объект String, в зависимости от вашего языка.