The more I see ref used in production code, the more misuse I encounter and the more pain it causes me. I have come to hate this keyword, because from a framework-building s
Most of the Interlocked methods use ref
parameters for (I’m sure you agree) good reason.
I try to avoid it on public APIs, but it definitely has uses. Mutable value-types is an important one, especially on things like CF (where mutable structs are more common, due to platform requirements). However, perhaps the most common time I use it is when refactoring parts of a complex algorithm out into a few methods, where a state object is overkill and I need to pass multiple values around:
i.e.
var x = .....
var y = .....
// some local code...
var z = DoSomethingSpecific(ref x, ref y); // needs and updates x/y
// more local code...
etc. Where DoSomethingSpecific
is a private method, just moved out to keep method responsibility manageable.
The Framework Design Guidelines (a book by Krzysztof Cwalina and Brad Abrams) recommend to avoid both ref
and out
parameters.
AVOID using
out
orref
parameters.Using
out
orref
parameters requires experience with pointers, understanding how value types and reference types differ, and handling methods with multiple return values. Also, the difference betweenout
andref
parameters is not widely understood. Framework architects designing for a general audience should not expect users to master working without
orref
parameters.
The Framework Design Guidelines cite the canonical Swap
method as a valid exception:
void Swap<T>(ref T obj1, ref T obj2)
{
T temp = obj1;
obj1 = obj2;
obj2 = temp;
}
but at the same time a comment remarks
Swap always comes up in these discussions, but I have not written code that actually needed a swap method since college. Unless you've got a very good reason, avoid
out
andref
altogether.
How about if one wishes to pass an array to a function which might or might not change its size and do something else to it. Often, one would wrap the array in another object, but if one wishes to handle the array directly passing by reference would seem the most natural approach.