如果 Object 为 null,您可以获取一个属性来返回某些内容



设备可以有ConnectedBattery有时其值为空,我尝试显示设备的一些详细信息,例如:

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

如果ConnectedBattery为空,我想将 ConnectedBattery.Name 返回为"none"。我尝试在游戏对象中执行此操作(电池和设备都继承自(

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

这样的事情可能吗?或者遗嘱只需要在详细信息中进行空检查

有两种方法可以执行此操作:

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

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

当"连接的电池"或"名称"为空时,这将输出"无"。

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(,因为它更明确地说明了您正在做的事情。对于人们来说,即使扩展方法所在的对象为 null,也可以调用它们并不总是很明显的,所以如果你使用 3(,人们可能会对你的代码感到困惑(。

实际上

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

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

否则,在尝试访问对象的任何属性之前,您必须从调用代码中检查对象本身是否为 null(使用没有 null 合并的示例(:

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

相关内容

  • 没有找到相关文章

最新更新