Есть ли простой способ сделать следующее:
String s = myObj == null ? "" : myObj.ToString();
Я знаю, что могу сделать следующее, но я действительно считаю это хакерством:
String s = "" + myObj;
Было бы здорово, если бы Convert.ToString () имел для этого подходящую перегрузку.
Convert.ToString()
делает то первое , что вы написали под ним.Ответы:
C # 6.0 Редактировать:
С C # 6.0 теперь у нас может быть сжатая версия исходного метода без приведения типов:
Или даже с помощью интерполяции:
Оригинальный ответ:
или
чтобы быть еще более кратким.
К сожалению, как уже указывалось, вам часто понадобится приведение с обеих сторон, чтобы эта работа работала с типами, отличными от String или Object:
Поэтому, хотя это может показаться элегантным, гипсовая повязка почти всегда необходима и на практике не является такой лаконичной.
Как было предложено в другом месте, я рекомендую, возможно, использовать метод расширения, чтобы сделать этот очиститель:
источник
string.Format отформатирует null как пустую строку и вызовет ToString () для ненулевых объектов. Насколько я понимаю, это то, что вы искали.
источник
"" + myObj
. Но я читал, что это создает лишние строки.str.Concat(myObj)
кажется, работает нормально и «даже быстрее».С тех пор существует
Convert.ToString(Object value)
.Net 2.0 (примерно за 5 лет до того, как этот вопрос был задан), который, похоже, делает именно то, что вы хотите:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Я упустил / неправильно истолковал что-то действительно очевидное?
источник
С помощью метода расширения вы можете сделать это:
Следующее ничего не напишет на экран и не вызовет исключения:
источник
string s = "" + myObj;
это хакерство, вызов функции для нулевого объекта должен попасть в ту же лодку. Я бы проголосовал против этого, но это решает проблему, я просто не согласен с использованием. Нулевые объекты должны бросатьNullReferenceException
даже в методах расширения.ToStringOrEmptyWhenNull
.this
параметр), потому что они просто синтаксический сахар. То естьx.SomeExtensionMethod()
это синтаксическийSomeStaticClass.SomeExtensionMethod(x);
Таким образом, когдаx
этоnull
мы не пытаемся вызвать метод наnull
объекте, а передаваяnull
объект на статический метод. Если и только если этот метод проверяетnull
параметр и выдает при обнаружении такого параметра метод расширения, «вызываемый» дляnull
объекта throw.Я не согласен с этим:
это хак в любом случае. Думаю, это хороший пример понятного кода. Абсолютно очевидно, чего вы хотите достичь и ожидаете null.
ОБНОВИТЬ:
Теперь я понимаю, что вы не говорили, что это была взлом. Но в вопросе подразумевается, что вы думаете, что этот путь не подходит. На мой взгляд, это определенно самое ясное решение.
источник
Я думаю, это был бы самый короткий путь, а также имел бы незначительные накладные расходы на производительность. Имейте в виду, что читателю кода будет не совсем понятно, в чем заключается намерение.
источник
Concat
самом деле внизу выполняется проверка на null и возвращаетstring.Empty
orarg0.ToString()
, что кажется немного более производительным (я имею в виду, мы говорим здесь ms).на самом деле я не понимал, что ты хочешь делать. Насколько я понимаю, можно написать этот код по-другому, вот так. Вы спрашиваете об этом или нет? Вы можете объяснить больше?
источник
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Я могу быть избит за свой ответ, но все равно здесь:
Я бы просто написал
строка s = "" если (myObj! = null) {x = myObj.toString (); }
Есть ли выигрыш с точки зрения производительности за использование тернарного оператора? Я не знаю, из головы.
И ясно, что, как уже упоминалось выше, вы можете поместить это поведение в такой метод, как safeString (myObj), который допускает повторное использование.
источник
У меня была такая же проблема, и я решил ее, просто преобразовав объект в строку. Это работает и для нулевых объектов, потому что строки могут быть нулевыми. Если вы абсолютно не хотите иметь нулевую строку, это должно работать нормально:
источник
Некоторые тесты производительности (скорости), суммирующие различные параметры, не то чтобы это действительно важно #microoptimization (с использованием расширения linqpad )
Параметры
Вероятно, важно отметить, что
Convert.ToString(...)
будет сохранена пустая строка.Полученные результаты
Объект
Строка
источник
Комментарий Холстебро был бы вашим лучшим ответом:
Если
myObj
имеет значение null, Format помещает туда значение пустой строки.Он также удовлетворяет вашим требованиям к одной строке и легко читается.
источник
Несмотря на то, что это старый вопрос, и OP запросил C #, я хотел бы поделиться решением VB.Net для тех, кто работает с VB.Net, а не с C #:
К сожалению, VB.Net не позволяет использовать? -Оператор после переменной, поэтому myObj? .ToString недействителен (по крайней мере, не в .Net 4.5, который я использовал для тестирования решения). Вместо этого я использую If для возврата пустой строки в случае, если myObj ist Nothing. Таким образом, первый Tostring-Call возвращает пустую строку, а второй (где myObj не Nothing) возвращает «42».
источник