Почему нет Char.Empty, как String.Empty? - PullRequest
236 голосов
/ 08 сентября 2010

Есть ли причина для этого? Я спрашиваю, потому что, если вам нужно использовать много пустых символов, вы попадаете в ту же ситуацию, что и при использовании большого количества пустых строк.

Редактировать: причина этого использования была:

myString.Replace ('c', '')

Так что удалите все экземпляры c из myString.

Ответы [ 19 ]

249 голосов
/ 08 сентября 2010

Нет такого понятия, как пустой символ. Самое близкое, что вы можете получить, это '\0', символ Unicode "null". Учитывая, что вы можете встроить это в строковые литералы или очень легко выразить его самостоятельно, зачем вам отдельное поле для него? Точно так же аргументы «легко спутать "" и " "» не применимы для '\0'.

Если бы вы могли привести пример, где вы хотели бы использовать его и почему вы думаете, что это будет лучше, это могло бы помочь ...

77 голосов
/ 08 сентября 2010

Символ, в отличие от строки, является дискретной вещью с фиксированным размером. Строка на самом деле является контейнером символов.

Итак, Char.Empty не имеет смысла в этом контексте. Если у вас есть символ, он не пустой.

30 голосов
/ 08 сентября 2010

Нет такой вещи как пустой символ. Он всегда содержит что-то . Даже '\ 0' является символом.

25 голосов
/ 08 сентября 2010

Используйте Char.MinValue, который работает так же, как '\ 0'. Но будьте осторожны, это не то же самое, что String.Empty.

19 голосов
/ 08 сентября 2010

Вы можете использовать nullable символы.

10 голосов
/ 08 сентября 2010

Если вам не нужна вся строка, вы можете воспользоваться отложенным выполнением:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}

Вы даже можете комбинировать несколько символов ...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... и будут оцениваться только первые 7 символов:)

РЕДАКТИРОВАТЬ: или, еще лучше:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}

и его использование:

        var veryLongText = "abcdefghijk...";
        IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChars('c', 'd')
            .Take(5)
            .ToArray(); //to prevent multiple execution of "RemoveChars"
6 голосов
/ 08 сентября 2010

по той же причине нет int.Empty. Контейнеры могут быть пустыми. Скалярные значения не могут быть. Если вы имеете в виду 0 (что не пусто), тогда используйте '\0'. Если вы имеете в виду null, то используйте null:)

5 голосов
/ 08 сентября 2010

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

Поскольку он не может быть нулевым, в нем содержится некоторый числовой код, и каждый код сопоставляется с каким-либо символом.

4 голосов
/ 21 мая 2011
myString = myString.Replace('c'.ToString(), "");

ОК, это не особенно элегантно для удаления букв, поскольку метод .Replace имеет перегрузку, которая принимает строковые параметры.Но это работает для удаления возврата каретки, перевода строки, вкладок и т. Д. В этом примере удаляются символы табуляции:

myString = myString.Replace('\t'.ToString(), "");
4 голосов
/ 04 февраля 2013

Не ответ на ваш вопрос, но для обозначения значения по умолчанию char вы можете использовать просто

default(char)

, что совпадает с char.MinValue, что, в свою очередь, совпадает с \0. Не следует использовать if для чего-то вроде пустой строки.

...