Dlaczego następująca awaria z NullReferenceException
na oświadczeniu a.b.c = LazyInitBAndReturnValue(a);
?Odnośniki użytkownika i kolejność przypisania do oceny
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);
}
}
wyrażenia przypisania są oceniane from right to left, więc do czasu jesteśmy przypisanie a.b.c
, a.b
nie powinna być zerowa. Co dziwne, kiedy debugger łamie się na wyjątku, to również pokazuje a.b
jako zainicjalizowane wartością inną niż null.
'b' jest określany w' a.b.c' zanim zostanie zainicjowany w 'LazyInitB ...()'. – ja72
Przeczytaj odpowiedzi przed komentarzem, zachowanie debuggera wydaje się pokazywać coś bardziej skomplikowanego niż to się dzieje. – SamStephens