Apart from the correct point that programming languages do not have to follow English grammar, I would like to add that it is generally encouraged to write readable code, and thus, do follow the rules of English.
And your proposed names do not do that - let me expand on that.
A name like IsShown
is typically a property of an object, which would appear in usage like this:
if (SomeObject.IsShown)
SomeObject.Hide();
For somebody who doesn't know the application, but who can read C#, this code is clear as day: "If SomeObject is shown, hide SomeObject."
If the property would be called IsItShown
, it would allude to a sentence like *"If SomeObject is it shown, ...", which is incorrect.
In general, a method or property always refers to the class it is a property or method of, and referring back to that class as "it" is superfluous at best and confusing at worst.
In the case of HasChild
, HasItChild
is equally confusing. I am not asking class B if class A has a child (in which case the name would make more sense). I am asking class A something about itself so I do not have to repeat who I am asking.
You could make a point to make a distinction between HasChild
and HasChildren
if there are really two distinct use cases for it.