Встроенное «если»: получить и проверить значение за один вызов - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующее

IPublishedContentProperty propTitle; // the type is not nullable

// Compiles, 2 GetProperty calls
var title = x.GetProperty("title").HasValue ? x.GetProperty("title").Value : null;

// Does not compile, 1 GetProperty call
    title = (propTitle=x.GetProperty("title") && propTitle.HasValue) ?propTitle.Value:null;

Предположим, GetProperty является трудоемкой операцией, и я хотел бы вызвать этот метод только один раз.Итак, первая строка как она компилируется.Второй - нет, но это то, чего я хотел бы достичь.

Ограничения:

  1. .NET-специфическая версия;
  2. не используйте if блоки.

PS..HasValue не означает, что тип может быть обнуляемым, это просто тип, имеющий такое свойство bool.

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Причина некомпиляции: && вычисляется до =&&, очевидно, не является допустимой операцией для этих типов.

Это можно исправить с помощью пары скобок.Затем .HasValue может быть применено к результату присвоения (который является объектом или значением, которое было присвоено ).

title = (propTitle = x.GetProperty("title")).HasValue ? propTitle.Value : null;

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

Пример:

namespace Your.Project.Helpers
{
    public static class PropertyHelper
    {
                                               // use actual type (or interface)
        public static string GetValueOrDefault(this Property p) 
        {
            return p.HasValue ? p.Value : null;
        }
    }
}

Использование:

using Your.Project.Helpers;

...

var title = x.GetProperty("title").GetValueOrDefault();
...