Мне нравится оператор объединения с нулевым значением, потому что он упрощает присвоение значения по умолчанию для типов, допускающих значение NULL.
int y = x ?? -1;
Это здорово, за исключением случаев, когда мне нужно сделать что-нибудь простое с x
. Например, если я хочу проверить Session
, мне обычно приходится писать что-то более подробное.
Хотел бы я сделать это:
string y = Session["key"].ToString() ?? "none";
Но вы не можете, потому что вызывается .ToString()
перед нулевой проверкой, поэтому он не работает, если Session["key"]
равен нулю. В итоге я делаю вот что:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Он работает и, на мой взгляд, лучше, чем трехстрочный вариант:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Несмотря на то, что это работает, мне все еще интересно, есть ли лучший способ. Кажется, что мне всегда приходится ссылаться Session["key"]
дважды; один раз для проверки, и еще раз для задания. Любые идеи?
.?
), как в Groovy .Ответы:
Что о
источник
.ToStringOrDefault()
- мой предпочтительный способ сделать это. Однако я использую этот ответ в методе расширения Джона;)Если вы часто делаете это специально,
ToString()
то можете написать метод расширения:Или, конечно, метод по умолчанию:
источник
.ToStringOrDefault()
прост и элегантен. Хорошее решение.object
- это проклятие и мусор в базе кода, а методы расширения, которые работают без ошибок с нулевымиthis
значениями, являются чистым злом.Вы также можете использовать
as
, который дает результат вnull
случае сбоя преобразования:Это вернется,
"none"
даже если кто-то вставитint
вSession["key"]
.источник
ToString()
.ToString()
для преобразования объекта, содержащего строку, в строку. Вы можете сделать то же самое с помощьюobj as string
или(string)obj
. Это довольно распространенная ситуация в ASP.NET.ToString()
объект (а именноSession["key"]
), тип которого он не упомянул. Это может быть любой объект, не обязательно строка.Если всегда будет
string
, вы можете использовать:Это дает преимущество в виде жалобы вместо того, чтобы скрывать ошибку, если кто-то запихивает
int
что-то в нееSession["key"]
. ;)источник
Все предложенные решения хороши и отвечают на вопрос; так что это просто немного расширить его. В настоящее время большинство ответов относятся только к нулевой проверке и строковым типам. Вы можете расширить
StateBag
объект, включив в него общийGetValueOrDefault
метод, аналогичный ответу, опубликованному Джоном Скитом.Простой универсальный метод расширения, который принимает строку в качестве ключа, а затем проверяет тип объекта сеанса. Если объект имеет значение null или другой тип, возвращается значение по умолчанию, в противном случае значение сеанса возвращается строго типизированным.
Что-то вроде этого
источник
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
сессию. :)Мы используем метод под названием
NullOr
.использование
Источник
источник
Dot
но сочли это слишком неописательным. МыNullOr
выбрали хороший компромисс между самооценкой и краткостью. Если вы действительно не заботились о наименовании, вы всегда могли его назвать_
. Если вы считаете лямбды слишком громоздкими для написания, вы можете использовать для этого фрагмент, но лично я считаю это достаточно простым. Что касается? :
, вы не можете использовать это с более сложными выражениями, вам придется переместить их в новый локальный;NullOr
позволяет избежать этого.Я предпочитаю использовать безопасное преобразование в строку в случае, если объект, хранящийся с ключом, не является таковым. Использование
ToString()
может не дать желаемых результатов.Как говорит @Jon Skeet, если вы обнаружите, что делаете это много, это метод расширения или, что еще лучше, возможно, метод расширения в сочетании со строго типизированным классом SessionWrapper. Даже без метода расширения может быть хорошей идеей использование строго типизированной оболочки.
Используется в качестве
источник
создать вспомогательную функцию
источник
Ответ Скита самый лучший - в частности, я думаю, что он
ToStringOrNull()
довольно элегантен и лучше всего соответствует вашим потребностям. Я хотел добавить в список методов расширения еще одну опцию:Вернуть исходный объект или строковое значение по умолчанию для null :
Используйте
var
для возвращаемого значения, поскольку оно будет возвращено как исходный тип ввода, только как строка по умолчанию, когдаnull
источник
null
defaultValue
если оно не нужно (то естьinput != null
)?input != null
Eval возвращает объект , как он сам.input == null
возвращает строку, указанную в качестве параметра. поэтому возможно, что кто-то может позвонить.OnNullAsString(null)
- но цель (хотя и редко полезный метод расширения) заключалась в том, чтобы убедиться, что вы либо получите объект обратно, либо строку по умолчанию ... никогда не nullinput!=null
Сценарий будет возвращать только вход , еслиdefaultValue!=null
имеет место; в противном случае он выброситArgumentNullException
.Это мой маленький типобезопасный "оператор Элвиса" для версий .NET, которые не поддерживают ?.
Первый аргумент - это проверяемый объект. Во-вторых, функция. И третье - нулевое значение. Итак, для вашего случая:
Это также очень полезно для типов, допускающих значение NULL. Например:
источник