C#:.NET:Method

.NET Array Dictionary List String 2D Async DataTable Dates DateTime Enum File For Foreach Format IEnumerable If IndexOf Lambda LINQ Parse Path Process Property Regex Replace Sort Split Static StringBuilder Substring Switch Tuple

Out signifies a reference parameter. Sometimes methods must return more than one value and not store class state. Out fills these requirements. With it we pass parameters whose changes are realized in their calling methods.


Example. The .NET Framework provides robust support for creating object-oriented logic that concentrates on storing multiple values as fields in classes. But it also provides a way to return many values from a method without using objects.

Return

Keyword: The out-keyword describes parameters whose actual variable locations are copied onto the stack of the called method.

And: Those same locations can be rewritten. This means that the calling method will access the changed parameter.

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

The program defines a Program class with two enclosed static method. The Main entry point is where the program execution begins. In Main, three local bool variables are declared but not initialized.

Bool

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

Calling pattern. The TestString method as shown can be used in certain kinds of programs that want to find multiple properties of the string in a single pass through the string's characters.

Tip: You could search individually for each character. But this would incur more overhead.

Therefore: This provides a way for the calling method to query if the string has any of the specified characters, and which ones.


Discussion. The out descriptor tells the intermediate language compiler to copy the actual variable storage location, not just the value at a storage location. Out parameters are often most useful for value types such as bool.

Warning: There is no other easy way to return multiple values without allocating an array or object.

ArraysObject

Definite assignment. The C# compiler applies definite assignment analysis. In the program, the three Boolean values are uninitialized. They are never assigned in Main. But the out keyword demands that they are always assigned in the body of TestString.

RefDefinite Assignment

Note: The compiler knows that the three Boolean variables are always set to an explicit true or false value when TestString returns.


Summary. 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 into a single call. We return all the relevant values.