我最近看到了下面的代码,让我很困惑。
dynamic resultObj = SomeClass.run(arg);
if (resultObj == null || resultObj.ToString() == null)
{
/* Error handling */
}
假设
SomeClass
是您典型的类(未覆盖 ToString()
),第二部分条件语句有必要吗?此代码还存在其他潜在问题吗?动态变量可以直接检查是否为 null,但某些情况可能会产生错误的答案。为了检查动态变量是否为 null,您应该将其转换为对象。例如:
dynamic post = SomeMethod();
if (post.modified == null){
//could return errors.
}
为了检查这个属性是否为null,你应该像这样做:
string.IsNullOrEmpty(Convert.ToString(post.Modified));
同样地,要检查动态变量是否为null,您应该这样做:
if ((object)post != null)
参考文献:
https://ericlippert.com/2018/11/19/a-dynamic-definite-assignment-puzzle-part-2/
https://forums.asp.net/t/1592751.aspx?How+to+check+for+null+empty+strings+on+dynamic+objects+
因此,通过检查resultObj.ToString() == null,我认为这可能会将dynamic转换为对象,从而使真正的null检查成为可能。
run
函数返回什么?如果它可能返回一个覆盖了ToString
并且有可能返回 null 的类,那么是的,在if
块中使用ToString
的结果时需要进行第二次检查。所有的dynamic
意思就是“在运行时我不知道类型”。 - D StanleyToString
,那么它就会调用object.ToString()
,该方法返回 对象类型的完全限定名 - 因此,是的 - 不需要进行.ToString() == null
检查。 - Rob