首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#检查属性是否为空的优雅方法

C#检查属性是否为空的优雅方法
EN

Stack Overflow用户
提问于 2010-08-12 13:40:40
回答 19查看 156.2K关注 0票数 119

在C#中,假设您希望从本例中的PropertyC中提取一个值,而ObjectA、PropertyA和PropertyB都可以为null。

ObjectA.PropertyA.PropertyB.PropertyC

如何用最少的代码安全地获得PropertyC?

现在我要查查:

代码语言:javascript
运行
复制
if(ObjectA != null && ObjectA.PropertyA !=null && ObjectA.PropertyA.PropertyB != null)
{
    // safely pull off the value
    int value = objectA.PropertyA.PropertyB.PropertyC;
}

做更像这样的事情(伪代码)是很好的。

代码语言:javascript
运行
复制
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;

甚至有可能用一个空聚结操作符进一步崩溃。

编辑最初我说我的第二个示例类似于js,但我将其更改为psuedo代码,因为正确地指出它在js中不能工作。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2014-11-07 02:03:32

在C# 6中,您可以使用空条件算子。所以最初的测试是:

代码语言:javascript
运行
复制
int? value = objectA?.PropertyA?.PropertyB?.PropertyC;
票数 155
EN

Stack Overflow用户

发布于 2014-04-02 10:56:53

短扩展法:

代码语言:javascript
运行
复制
public static TResult IfNotNull<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator)
  where TResult : class where TInput : class
{
  if (o == null) return null;
  return evaluator(o);
}

使用

代码语言:javascript
运行
复制
PropertyC value = ObjectA.IfNotNull(x => x.PropertyA).IfNotNull(x => x.PropertyB).IfNotNull(x => x.PropertyC);

这种简单的扩展方法以及在http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/上可以找到的更多内容

编辑:

在使用它片刻之后,我认为这个方法的正确名称应该是IfNotNull(),而不是原来的With()。

票数 28
EN

Stack Overflow用户

发布于 2010-08-12 13:50:14

你能给你的班级添加一个方法吗?如果没有,您考虑过使用扩展方法吗?您可以为对象类型创建一个名为GetPropC()的扩展方法。

示例:

代码语言:javascript
运行
复制
public static class MyExtensions
{
    public static int GetPropC(this MyObjectType obj, int defaltValue)
    {
        if (obj != null && obj.PropertyA != null & obj.PropertyA.PropertyB != null)
            return obj.PropertyA.PropertyB.PropertyC;
        return defaltValue;
    }
}

用法:

代码语言:javascript
运行
复制
int val = ObjectA.GetPropC(0); // will return PropC value, or 0 (defaltValue)

顺便说一下,这假设您使用的是.NET 3或更高版本。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3468250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档