To tzw. operator warunkowy. Składnia jest taka:
warunek ? wyrażenie1 : wyrażenie2
Sprawdzana jest wartość (logiczna!) wyrażenia warunek i zwracana jest wartość wyrażenie1, jeśli warunek jest prawdziwy lub wyrażenie2, gdy jest warunek jest fałszywy.
W twoim przypadku, jeśli metoda GetTarget() zwróci prawdę, do zmiennej DoIt zostanie podstawione to, co zwróci metoda GetState(). Nie wiadomo tylko, co zostanie podstawione w przypadku fałszu.
Niby jest to krótsze niż zwykły if, ale bardzo rzadko tego używam - chyba dlatego, że dużo łatwiej przeoczyć to podczas czytania kodu.