#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. Исключения следует перехватывать только в исключительных обстоятельствах. Если вы можете проверить входные данные, которые могут вызвать исключение, вы должны это сделать.