设备可以有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;