C# out Parameter

Use the out keyword on arguments. Out parameters help simplify some methods.

Out. This C# keyword signifies a reference parameter. Sometimes methods must return more than one value and not store class state.Parameters

Out, a keyword, fills these requirements. With it we pass parameters whose changes are realized in their calling methods. In a method, an out argument must be assigned.

An example. The .NET Framework has robust support for object-oriented logic. But it also provides a way to return many values from a method without using objects.Return
First: In Main, 3 local bool variables are declared. These 3 variables are not initialized.
Then: Those same bool variable locations on the stack are initialized to the false Boolean literal in the TestString method called next.
And: In the loop in TestString, if certain characters occur in the string, the bool parameters are assigned true.
True, False
Info: TestString() can be used in programs to find multiple properties of the string in a single pass through the string's characters.
C# program that uses out Boolean parameters using System; class Program { static void Main() { bool period; // Used as out parameter. bool comma; bool semicolon; const string value = "has period, comma."; // Used as input string. TestString(value, out period, out comma, out semicolon); Console.WriteLine(value); // Display value. Console.Write("period: "); // Display labels and bools. Console.WriteLine(period); Console.Write("comma: "); Console.WriteLine(comma); Console.Write("semicolon: "); Console.WriteLine(semicolon); } static void TestString(string value, out bool period, out bool comma, out bool semicolon) { // Assign all out parameters to false. period = comma = semicolon = false; for (int i = 0; i < value.Length; i++) { switch (value[i]) { case '.': { period = true; // Set out parameter. break; } case ',': { comma = true; // Set out parameter. break; } case ';': { semicolon = true; // Set out parameter. break; } } } } } Output has period, comma. period: True comma: True semicolon: False

Inline out parameters. We can combine statements when calling a method that requires an out parameter. We can declare the variable directly inline with the method call.
Warning: This syntax will not work with older versions of the .NET Framework. So be sure to be targeting .NET 4.7 or later.
C# program that uses inline out parameter syntax using System; class Program { static bool Test(out int size) { // This method has an out parameter. size = 1000; return size >= 1000; } static void Main() { // Declare out parameter directly inside method call. if (Test(out int size)) { Console.WriteLine(size); } } } Output 1000

Discard name syntax. Sometimes we need to call a method with "out" parameters, but do not need to use those parameters. We can avoid using a "dummy" name for those locals.
Discard: The underscore char is a "discard name." The parameter exists, but is not referenced, and does not need a name.
C# program that shows out, discard name using System; class Program { static void Test(out int size, out string name) { size = 10; name = "bird"; } static void Main() { // We do not need the out int, so use an underscore name (discard name). Test(out _, out string name); Console.WriteLine("NAME: {0}", name); } } Output NAME: bird

A discussion. The out descriptor tells the intermediate language compiler to copy the actual variable storage location, not just the value at a storage location.
Tip: Out parameters are often most useful for value types such as bool, int or short.
Tip 2: There is no other easy way to return multiple values without allocating an array or object.
Multiple Return Values

Definite assignment. The C# compiler applies definite assignment analysis. The out keyword ensures that variables are always assigned in the body of a method.Ref

With out, a method can signal to the calling location that the variable location's were initialized and written. Out simplifies code where multiple function calls can be combined.

© 2007-2020 Sam Allen. Send bug reports to info@dotnetperls.com.