In C# objects are passed in functions by reference.
As Jon pointed out, the "real" story is fairly complicated. C# has 4 types
of parameters (value, ref, out, and variable length).
When you pass a reference type (a class or an array) to a method, the thing
you are passing is a reference, not the object.
The most common case is to pass the reference by value. The value of the
reference is copied to the method. The method can use it's reference to
change the data inside the object.
It is also possible to pass the reference as a reference parameter (yes, I
know that is hard to say ;-). In this case, the method can still use it's
parameter to change the data inside the object, but it now has the added
ability to assign to its reference and change the client's reference. This is
analogous to a C++ pointer to a pointer (i.e. **) parameter.
In any case, all of the above is not relevent to your question
but it
still might be interesting.