Всегда ли String.ToLower () выделяет память? - PullRequest
4 голосов
/ 03 февраля 2009

Возвращает ли String.ToLower() ту же ссылку (например, без выделения какой-либо новой памяти), если все символы уже в нижнем регистре?

Распределение памяти дешево, но быстрая проверка на миллионах коротких строк еще дешевле. Большую часть времени ввод, с которым я работаю, уже в нижнем регистре, но я хочу сделать так, если это не так.

Я работаю, в частности, с C # / .NET, но мое любопытство распространяется и на другие языки, поэтому не стесняйтесь отвечать за ваш любимый!

ПРИМЕЧАНИЕ. Строки являются неизменяемыми, но это не означает, что функция всегда должна возвращать новую, скорее это означает, что ничто не может изменить содержимое их символов.

Ответы [ 4 ]

10 голосов
/ 03 февраля 2009

Я ожидаю, что да. Быстрый тест соглашается (но это не доказательство):

string a = "abc", b = a.ToLower();
bool areSame = ReferenceEquals(a, b); // false

В общем, попробуйте поработать с компараторами , которые делают то, что вы хотите. Например, если вам нужен словарь без учета регистра, используйте его:

var lookup = new Dictionary<string, int>(
    StringComparer.InvariantCultureIgnoreCase);

Аналогично:

bool ciEqual = string.Equals("abc", "ABC",
    StringComparison.InvariantCultureIgnoreCase);
4 голосов
/ 03 февраля 2009

Строка является неизменной. String.ToLower () всегда будет возвращать новый экземпляр, тем самым генерируя другой экземпляр при каждом вызове ToLower ().

2 голосов
/ 03 февраля 2009

Java-реализация String.toLowerCase () от Sun на самом деле не всегда выделяет новую String. Он проверяет, все ли символы в нижнем регистре, и если да, то возвращает исходную строку.

1 голос
/ 03 февраля 2009

[править]
Стажировка не помогает - см. Комментарии к этому ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...