All too often, I see things like this:
C#:public void DoSomethingToAClass(ref AClass objectToChange)
{
// ... change some member variables of objectToChange or whatever
}
VB.NET:Public Sub DoSomethingToAClass(ByRef objectToChange As AClass)
' ... change some member variables of objectToChange or whatever
End Sub
This is totally redundant.
Classes are reference types. Therefore, by default they are passed by reference. This means that you can drop the
ref or
ByRef and achieve the same results. What's worse is that in the examples above, you're creating a reference to a reference, which just creates extra work for the application dereferencing them twice to find the actual object.
On the other hand, if what you're passing in to the method is a
value type, then this is what you want. Your intrinsic types (such as
Int32) and
struct (C#) or
Structure (VB.NET) are all value types. These need the
ref or
ByRef tag, otherwise your changes will be lost when the method exits. Note that while
Arrays and
Strings are also technically reference types, the framework handles them somewhat differently, and you must use
ref or
ByRef with them to get the desired result.
There are times when a reference to a reference is what you want, especially with certain P/Invoke methods that ask for a "pointer to a pointer" as one of the parameters. In this case, using
ref or
ByRef with a reference type makes sense and is what you want.