"Simen kjaeraas" <simen.kja...@gmail.com> wrote in message news:op.vltiombuvxi...@biotronic-pc.lan... > Nick Sabalausky <a...@a.a> wrote: >> If you do that, then there's two possibilities: >> >> A. You intended p to get inited on all code paths but forgot a codepath. >> With real init-checking the compiler will tell you and you can fix it. >> With >> D as it is, you're not informed at all, and you may or may not catch the >> problem before deployment. Obviously the former is better. >> >> B. You *intended* p to not always be inited, in which case the correct >> code >> is this: >> >> void foo( ) { >> Object p=null; >> if ( m ) { >> p = new Object( ); >> p.DoSomethingThatNeedsToBeDoneNow( ); >> } >> // 20 lines of code here >> if ( p != null ) { >> p.doSomethingWeird( dataFromAbove ); >> } >> } > > There is a third option, wherein the if condition will only be true if > p !is null, but the actual condition is more complex: > > if ( m > 4 ) { > p = new Object( ); > p.DoSomethingThatNeedsToBeDoneNow( ); > } > > // code > > if ( m > 12 ) { > p.doSomethingWeird( dataFromAbove ); > } >
- if ( m > 12 ) { + if ( p && m > 12 ) { And you can toss in an "if(m>12) assert(p);" if you're worried about that.