In reply to DamianS:
When not using macros, you are supposed to explicitly pass “this” from parent sequences when calling start. This creates a sequence hierarchy which enables features like killing a hierarchy of sequences, child-to-parent-sequence callbacks, and targeting specific sub-sequences for config_db sets or factory overrides. It also is used by some debug tools for transaction, relationship visualization in waveforms.
When starting a sequence from a test, there is no parent sequence so you leave the second field null to denote it is a root sequence running on the sequencer.
w.r.t. to `uvm_do(), I think the point is that it fills in the “this” for you, so you don’t have to remember to do it. If null was the default, then you’d still have to remember to do it.
If you want to use macros, you’re free to create your own macros that work the way you want.