На самом деле, все в Java передается по значению, ссылки являются особым типом значения, так же как указатели являются значениями в C. Подробнее о семантике здесь:
http://javadude.com/articles/passbyvalue.htm
C #, с другой стороны, имеет реальные ссылки в стиле C ++, которые не имеют отношения к ссылочным значениям ... Может ли это быть еще более запутанным, чем это?