Почему следующая авария с NullReferenceException
в заявлении a.b.c = LazyInitBAndReturnValue(a);
?Ссылки на участников и порядок их назначения
class A {
public B b;
}
class B {
public int c;
public int other, various, fields;
}
class Program {
private static int LazyInitBAndReturnValue(A a)
{
if (a.b == null)
a.b = new B();
return 42;
}
static void Main(string[] args)
{
A a = new A();
a.b.c = LazyInitBAndReturnValue(a);
a.b.other = LazyInitBAndReturnValue(a);
a.b.various = LazyInitBAndReturnValue(a);
a.b.fields = LazyInitBAndReturnValue(a);
}
}
Назначение выражения вычисляется from right to left, так что к тому времени, когда мы назначаем a.b.c
, a.b
не должен быть пустым. Как ни странно, когда отладчик разбивается на исключение, он также показывает a.b
как инициализированное ненулевым значением.
'b' ссылается на' a.b.c' перед его инициализацией в 'LazyInitB ...()'. – ja72
Прочитайте ответы перед комментарием, поведение отладчика, похоже, показывает нечто более сложное, чем это происходит. – SamStephens