Straight off the bat I'd say readability. We all know that Read() will return False if there are no more rows to fetch, but Reader.HasRows is much more telling as to what it does than Read().
Under the surface though, they're doing quite different things. HasRows is simply telling you whether or not there are any rows to read, whereas Read() advances the internal cursor to the next row in the data, and incidentally returns False if there are no more rows to read, or True if there was another row available.
Also, you've probably just picked a simple example but with HasRows, you'd have to use Read to advance the cursor to the first row. You'd generally use HasRows to determine whether or not you need to enter a loop which reads all of the data from your data source, like so:
If reader.HasRows then
while reader.Read()
txtCR_Subject.text = reader("subject")
end while
end if