Безопасное усечение строки в C #, которая может быть `null`

#c#

#c#

Вопрос:

У меня есть следующий метод, но он завершается неудачей, если строка равна null. Как я мог бы заставить ее просто возвращать значение null, если строка равна null?

 public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ?
           value :
           value.Substring(0, maxChars)   " ..";
}
  

Не мог бы кто-нибудь также объяснить мне, для чего существует «это». Извините, я не так хорош в C #, и это не мой код.

Комментарии:

1. Вы спрашиваете, как добавить if оператор и второй return ? Действительно?

2. Переведите свое последнее предложение почти непосредственно в код.

3. В чем ваша проблема? Что вы пробовали?

4. Я думаю, вам нужно Substring(0, maxChars - 3) . В противном случае эта Truncate процедура может фактически увеличить длину строки.

Ответ №1:

Путем проверки на null и соответствующего возврата 🙂

 public static string Truncate(this string value, int maxChars)
{
    if (value == null)
    {
        return null;
    }
    return value.Length <= maxChars ?
           value : value.Substring(0, maxChars)   " ..";
}
  

Или вы могли бы даже использовать другое условное:

 public static string Truncate(this string value, int maxChars)
{
    return value == null ? null
        : value.Length <= maxChars ? value 
        : value.Substring(0, maxChars)   " ..";
}
  

Комментарии:

1. Есть ли причина не использовать string.IsNullOrEmpty здесь? Я склонен не подвергать сомнению Skeetmeister, но, похоже, это было бы предпочтительнее.

2. @Многочлен, который нарушил бы спецификацию. Операционная система хочет вернуть, null если параметр равен null , но, скорее всего, он хочет, "" если параметр пуст. По моему опыту, очень редко хороший дизайн трактует "" и null как эквивалентные.

3. @CodeInChaos — Ах да, я пропустил этот момент. В этом случае код идеален сам по себе. Двигайтесь вперед! 🙂

4. Я немного смущен, поскольку это не мой код. Можете ли вы объяснить, для чего «это»?

5. @Melissa: Это делает его методом расширения — это означает, что вы могли бы вызывать его как someString.Truncate(10) — это делает статический метод похожим на метод экземпляра другого типа (в данном случае string).

Ответ №2:

В дополнение к хорошему ответу Джона Скита вы хотели знать, для чего это this . Это делает этот метод методом расширения. Вы расширяете функциональность класса string с помощью вашей конкретной функции. this string value волшебство Visual Studio заключается в том, что она показывает вам эту функцию в контекстном меню для каждой строковой переменной, а для того, чтобы компилятор предоставил переменную, метод вызывается в качестве первого параметра для нее. Функция должна быть статической.

Ответ №3:

Поместите блок try catch. Если это сработает, верните null.

Комментарии:

1. Нет, это не идиоматический способ обработки исключений, которых можно полностью избежать в C #. Проще, эффективнее и удобочитаемее явно проверять наличие null.

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