假设我有一个类,有很多成员和嵌套成员,执行这个调用,其中一个变量为null(除了等式两边的最后一个变量):
Obj.Field.NextField.NextNextField = NextObj.OtherField.NextOtherField.NextNextOtherField;
我将得到一个NullReferenceException,它表示此行中的一个对象为null。在本例中,有6种不同的情况可能会引发异常。
到目前为止,我经常遇到这种情况,并且总是执行以下操作来找出哪个成员实际上是null。
public static void PrintNullOrigin(params object[] _args)
{
for (int i = 0; i < _args.Length; i++)
{
if (_args[i] == null)
{
print(_args[i] + " is null!");
}
}
}
但在这种情况下,你仍然必须这样做:
PrintNullOrigin(Obj, NextObj, Obj?.Field, NextObj?.OtherField, ...);
有没有一种方法可以在任何时候抛出NullReferenceException时,记录器都会自动执行此操作?
我尝试通过Exception对象获取NullReferenceException所源自的行中的成员,但是我找不到任何使这变得容易的东西。
编辑:
我必须在这里强调,我想知道是否有可能在Visual Studio调试模式之外进行此操作。
在Unity中,应尽量少使用Visual Studio的调试模式,因为在运行时可能会发生崩溃和性能损失。
2条答案
按热度按时间mf98qq941#
当您存取字段时,无法打印出哪一个字段是空值。在存取字段之前,您仍必须进行一些检查。此检查可以有多种方式:
1.您可以使用类似CheckForNull(NextObj,“NextObj.OtherField.NextOtherField.NextNextOtherField”)的函数,然后通过拆分第二个参数并使用反射-您可以调查此路径中的哪些字段为空
1.这种方式有点复杂:第二个参数的类型可以是Expression〈Func〈NextObj,T〉〉,值可以是obj =〉NextObj. OtherField. NextOtherField. NextNextOtherField.这样你就有了这个Map的表达式,你可以通过检查这个表达式树来找出哪个字段是空的。
但总的来说,如果你有这样的东西:“NextObj.OtherField.NextOtherField.NextNextOtherField”这是一个不好的信号-因为当你不得不这样做时,它是一个架构很差的应用程序。
qij5mzcb2#
您可以执行以下操作: