inline "if": 在一次调用中获取并测试一个值

Inline "if": obtain and test a value in one call

我有以下

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 属性.

的类型

不编译的原因:&&=之前求值。 && 显然不是对这些类型的有效操作。

这可以用一对牙套固定。然后可以将 .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();