Tuesday, July 7, 2009

Help with "ref" and "out" in C# .NET 3.5 2008

In this article, I will discuss the out keyword and the ref keyword in C Sharp. These should be used sparingly but are handy in certain situations (especially when dealing with structs and sorting).

If you do not understand pointers yet, I would advise steering clear of these.


Similarities to other languages

Both "out" and "ref" mean pass the variable into the function "by reference".

If you are a VB6 guru, this is similar to the "ByRef" keyword.

If you're a C++ writer, you would use the address of operator "&" (if you did not already have a pointer to the object) and the function would have "*" following the data type.

There is no such modifier in Java.


What do they mean?

Out and ref extend the meaning of "by reference" by additionally stating that the variable must be initialized and will be modified (ref) or that it will be initialized inside of the function (out).

The default (no prefix to the parameter) is a "by value" copy of a structure/simple data type or a "read-only reference" of an object meaning you cannot change where it points to but you can change the variables inside of the class. This is how Java works.


The "ref" Parameter Modifier
  • "ref" is by reference
  • It does not give a compiler error if it was not passed in the argument list for the function
  • It gives you the ability to modify the pointer of the original object
  • It is a great way to pass structures around in code because it does not make a "by value" copy of them
  • Parameter must be initialized before calling the function
  • "ref" prefix exists when defining the function and when calling it (making it obvious that this is a by reference call)

Example of By-Reference Parameters in C#
public void SimpleSwap(ref String string1, ref String string2)
{
// store the pointer of string1
String temp = string1;
// set string1's pointer to point to string2
string1 = string2;
// set string2's pointer to point to string1 (HINT: this is not pointing to string2)
string2 = temp;
}

// ... code using this ...
String string1 = "ABC";
String string2 = "DEF";
SimpleSwap(ref string1, ref string2);

// string1 now points to "DEF"
// string2 now points to "ABC"


The "out" Parameter Modifier
  • "out" is by reference
  • The parameter must be assigned or you get a compile error
  • A new object is created and returned (the variable you passed in points to the one created inside of the function)
  • "out" parameters do not need to be initialized
  • This is a great way to fill structures
  • It allows the language to safely handle multiple return values without the need for new objects/structs
  • "out" prefix exists when defining the function and when calling it (making it obvious that this variable will be initialized by the function call)

Example of a Function Returning Multiple Values in C#
public void GetCoordinates(out int x, out int y)
{
x = 5;
y = 9;
}


// ... code using this ...
int x;
int y;

GetCoordinates(x,y);
// x is now 5
// y is now 9

Conclusion

Out and ref are great tools when you need them. I hope this article helps you understand more about how they work.

Note: I use the terms "keyword", "modifier", and "prefix" when discussing ref and out. The actual term (AFAIK) for these is "modifier".

Note: Code examples in this article are incomplete and will not compile. If you require complete examples, please leave a comment and I will post them for everyone.