设备有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; }
}
甚至可能是这样的吗? 或只是必须在详细信息中进行空检查
答案 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),人们可能会对你的代码感到困惑。