C#: 如何在动态对象上执行空值检查

33

我如何在动态对象上执行null-check

伪代码:

public void Main() {
    dynamic dynamicObject = 33;
    if(true) { // Arbitrary logic
        dynamicObject = null;
    }
    Method(dynamicObject);
}

public void Method(dynamic param) {
    // TODO: check if the content of 'param' is equal to null
}
4个回答

44

你是否担心动态对象会有自定义的相等运算符,从而改变了对 null 的解释?如果是这样,只需使用 Object.ReferenceEquals

if (Object.ReferenceEquals(null, param)) {
  .......
}

@Ani 不确定你在说什么。 - JaredPar
3
您可以直接写ReferenceEquals(null, param)。我无法相信在Stack Overflow上关于这个话题的近5个问题都没有这样简单地解决它。 - Seb Nilsson
@Ani 明白了。我更喜欢使用长格式,因为这样可以减少绑定到具有不同行为的更本地的 ReferenceEquals 实现的可能性。 - JaredPar
1
@JaredPar:好的。当然,包含类型也可以包含一个名为“Object”的成员,其中包含一个名为“ReferenceEquals”的实例方法,其行为也不同。 - Ani
2
@Ani 当然。对我来说,这几乎是邪恶的,实际上每个代码示例都可以被某个邪恶的人打败。 - JaredPar
显示剩余3条评论

0

你可以始终将参数类型设置为 object,这就是编译器正在做的事情。当你将参数类型设置为 dynamic 时,它仅意味着在该方法内部,所有使用 param 的地方都使用动态调用,但在外部,它只是一个类型为 object 的签名。更强大的 dynamicObject 使用方式是拥有你正在调用的方法的重载,因此,如果你保持示例不变,只需有两个重载,它将根据运行时类型调用其中一个方法,并且你始终可以添加更多以供更多类型使用。

public void Main() {
    dynamic dynamicObject = 33;
    if(true) { // Arbitrary logic
        dynamicObject = null;
    }
    Method(dynamicObject);
}
public void Method(int param) {
  //don't have to check check null
  //only called if dynamicObject is an int
}
public void Method(object param) {
// will be called if dynamicObject is not an int or null
}

0

快速的方法可能是:

if (_owner is null)
{

}

0

你可以使用简单性:

var s = data.servicePhoneNumber is null ? "" : data.servicePhoneNumber.Value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接