Проверка результата функции на нулевые значения - PullRequest
1 голос
/ 23 марта 2012

В своем ответе на на этот вопрос BlackBear предложил заменить

 string y = Session["key"] == null ? "none" : Session["key"].ToString();

с

 string y = (Session["key"] ?? "none").ToString();

Это прекрасно работает, если Session["key"] является строковым значением, но что, если я хочу сделать это с объектом? Например, я мог бы сделать это:

 string y = GetMyObject() == null ? "none" : GetMyObject().ToString();

Но что, если я не хочу оценивать GetMyObject() дважды? Является ли мой единственный выбор для сохранения результатов в переменной, а затем проверить эту переменную на нулевое значение?

 var x = GetMyObject();
 string y = (x == null) ? "none" : x.ToString();

Редактировать: Это все теоретически - я сталкивался с этим раньше, но у меня нет конкретного примера передо мной прямо сейчас. При этом, вот пример класса.

class MyObject
{
   private MyObject() { }
   public MyObject GetMyObject() { return new MyObject(); }
   public override string ToString() { return "A String"; }
}

Если я сделаю string y = (GetMyObject() ?? "none").ToString();, я получу

Оператор '??' не может быть применен к операндам типа 'MyObject' и 'string' ".

В идеале я бы смог сделать

 string y = GetMyObject().ToString() ?? "none";

и он будет работать, даже если GetMyObject () имеет значение null. В основном нуль-сливающийся оператор, действующий как автономный try {} catch (NullReferenceException) {}. Я знаю, что не могу , но это было бы идеально.

Ответы [ 3 ]

4 голосов
/ 23 марта 2012

Решение BlackBear прекрасно работает как оно есть:

string y = (GetMyObject() ?? "none").ToString();

Это либо установит y в GetMyObject().ToString() (если GetMyObject() возвращает ненулевую ссылку), либо в "none".ToString() в противном случае. Есть крошечный, крошечный хит, вызывающий ToString() на строку, но я бы очень сомневался, что это важно.

Хорошо, если GetMyObject() вернет object. Если он возвращает какой-то определенный тип, в который string не может быть преобразован , просто приведите один из них к object, например

string y = (GetMyButton() ?? (object) "none").ToString();

Сказав это, я бы, вероятно, использовал метод расширения в этот момент - или просто сделал бы это от руки.

2 голосов
/ 23 марта 2012

Похоже, вы хотели бы использовать нулевой безопасный оператор разыменования, записанный как ?. на некоторых языках:

var x = GetMyObject()?.ToString() ?? "none";

К сожалению, в C # нет этого оператора. Вы можете сделать это так, как вы уже это делаете.

Этот оператор считается для добавления к языку. Однако это не вошло ни в какую выпущенную версию C #.

0 голосов
/ 23 марта 2012

Чего не хватает в коде, можно [обычно] добавить:

private static object SafeToString( object obj, string defaultString = "none" )
{
    return obj != null ? obj.ToString() : defaultString;
}
...