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
是一个耗时的操作,我想只调用一次这个方法。
因此,第一行是编译时的内容。第二个它没有,但这是我想要实现的。
约束条件:
- .NET 特定版本;
- 不要使用
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();
我有以下
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
是一个耗时的操作,我想只调用一次这个方法。
因此,第一行是编译时的内容。第二个它没有,但这是我想要实现的。
约束条件:
- .NET 特定版本;
- 不要使用
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();