You need to understand the following: parameters are passed by references only if
ref
or
out
is specified. So, your statement is incorrect: the objects, even the objects (instances) of classes are passed be value in all other cases. You just need to understand what it means.
Still, the class instances passes by value behave as if they were passed by reference: you can modify the instance inside a method and have it modified on exit. The same state for all other by-reference types, such as arrays. Why? This is because you really pass the variable or some other type's member to the method. And such objects are really pairs of object: the object itself and the reference to it. In C#, you cannot operate reference-type objects directly, you always do it through a reference. And a reference is passed to a method by value.
Finally, in nearly all cases, there is no point of passing a reference-type object by references. This is not prohibited, but rarely can make sense. If you really want to return a reference to some object which has been created inside the method, or if you replace some passed reference by another reference, consider using methods' return values.
See also my past answer on the nature of reference-type objects:
Equivalent of 'C' pointer in c#.[
^].
I hope you can draw the conclusions.
—SA