c#中对于“如果foo = n't null”有什么好的语法?返回它的一个属性,否则为空

本文关键字:语法 返回 一个 属性 什么 如果 foo null | 更新日期: 2023-09-27 18:14:39

在下面的小代码片段中,我有一个简单动态对象的包装器类,当它不为空时,我可以访问两个属性,"id"answers"name"。这是一个Facebook对象,供在家玩的人使用。

无论如何,在我的GET访问器中,你可以看到我必须检查我给定的动态对象是否为null,因为在null引用上引用动态属性将AV。但由于我可能是第一百万个人这样做,我假设有一种更简洁优雅的方式来表达它。

请开导我,哦,伟大的圣人。谢谢!

public class IdNamePair
{
    private dynamic _data;
    public IdNamePair(dynamic data)
    {
        _data = data;
    }
    public string Id
    {
        get
        {
            return (_data == null) ? null : _data.id;
        }
    }
    public string Name
    {
        get
        {
            return (_data == null) ? null :_data.name;
        }
    }
}

c#中对于“如果foo = n't null”有什么好的语法?返回它的一个属性,否则为空

你所做的没有错,我唯一要做的就是放下括号并改变计算:

return _data != null ? _data.name : null;

这样做只是(IMVHO)稍微容易阅读,但基本上是相同的,你有

不,这就是你必须要做的。我猜你比你想象的要聪明。

使用您已经拥有的代码最有可能是最好的解决方案。但是如果你愿意,你可以创建一个像这样的扩展方法:

public static TResult Select<T, TResult>(this T obj, Func<T, TResult> func)
    where T : class
    where TResult : class
{
    return obj == null ? null : func(obj);
}

,并像这样使用:

public string Id
{
    get
    {
        return _data.Select(d => d.id);
    }
}

但是这会使代码对大多数人来说可读性变差。这个方法应该有个更好的名字

这样做基本上将可空引用类型视为Maybe monad。