内联“ if”:一次调用即可获取并测试一个值

时间:2018-11-21 10:05:54

标签: c# .net-4.5

我有以下

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 :(得分:3)

未编译的原因:&&=之前进行评估。并且&&显然不是对这些类型的有效操作。

这可以用大括号固定。然后可以将.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();