say you declare :
byte[] bb = new byte[1024];
That means you are declaring an array of bytes with 1024 elements.
So whenever you call
bb[20]
it actually calls indexer defined within the array definition which sends back the 20th element of the array.
You can also create your own Indexer using
public T this[]
{
get { .... }
}
This will ensure you to call in similar way for you own object as you do for arrays.