如果Object为null,你可以得到一个属性来返回一些东西吗?

时间:2017-05-16 02:36:18

标签: c# properties null

设备有ConnectedBattery,有时其值为null, 我尝试显示设备的一些细节,如:

  allDetails.Add("Conected to " + ConnectedBattery.Name);

如果ConnectedBattery为null,我想将ConnectedBattery.Name作为“none”返回。 我尝试在GameObjects中执行此操作(电池和设备都继承自)

public string Name
{
    get
    {
        if (this == null)
        {
            return "none";
        }
        return _name;
    }
    set { _name = value; }
}

甚至可能是这样的吗? 或只是必须在详细信息中进行空检查

2 个答案:

答案 0 :(得分:0)

实际上,在您具有私有支持字段的特定示例中,您可以执行类似的操作。如果整个对象为null,则没有this,但如果只有后备字段_name为空,那么您可以这样做:

public string Name
{
    get
    {
        if (_name == null)
        {
            return "none";
        }
        return _name;
    }
    set { _name = value; }
}

否则,从调用代码开始,您必须先检查对象本身是否为null,然后再尝试访问它的任何属性(使用不带空值合并的示例):

string batteryName = (connectedBattery == null) ? "none" : ConnectedBattery.Name;

答案 1 :(得分:0)

有两种方法可以做到这一点:

1)使用空条件运算符.?和空合并运算符??

allDetails.Add("Connected to " + ConnectedBattery?.Name ?? "none");

这将输出" none"当ConnectedBattery或Name为空时。

2)使用静态方法:

public static string GetBatteryName(Battery battery)
{
    return battery?.Name ?? "none";
}

allDetails.Add("Connected to " + Battery.GetBatteryName(ConnectedBattery));

3)使用扩展方法:

public static class BatteryExtensions
{
    public static string GetBatteryName(this Battery battery)
    {
        return battery?.Name ?? "none";
    }
}

allDetails.Add("Connected to " + ConnectedBattery.GetBatteryName());

2和3将实现与1)相同,但您可以在多个地方使用它们,而无需始终编写空合并代码。

就个人而言,我建议1)或2),因为它更明确地说明了你在做什么。人们总是很明显,即使他们所处的对象为空,也可以调用扩展方法,因此如果你选择3),人们可能会对你的代码感到困惑。