HomeSearch

C# return Keyword

Understand the return keyword. A method return statement is void or has a value.
Return. A pebble can be thrown into the air—but it does not travel up forever. It falls to the earth. It returns. In C# our methods too have returns.
In programs, methods return only one value. A return statement is a jump statement. It transfers control unconditionally to the end point of the call site in the stack frame.Keywords
An example. As a jump statement, return affects control flow. Control flow models the path of the execution engine when it manipulates evaluation stacks in methods.

Info: Whenever an argument to a method is encountered, a token is pushed onto the stack and the new method is invoked.

Steps: In the called method, 3 kinds of memory are allocated: the parameter slots, the local variable slots, and the evaluation stack.

MethodA: MethodA loads the constant integer 100 and returns that value to the call site. This method is small so it is often inlined.

const

MethodB: This accepts a parameter of type boolean. The logic contained in the method is not returned, just the value of the evaluation.

Ternary Operator

MethodC: The integer resulting from the expression is placed on the stack and this single 4-byte value is copied to the call site.

C# program that uses return statement using System; class Program { static void Main() { // Call four methods and store their return values. int value1 = MethodA(); string value2 = MethodB(true); string value3 = MethodB(false); int value4 = MethodC(5, 2); // Display the results. Console.WriteLine(value1); Console.WriteLine(value2); Console.WriteLine(value3); Console.WriteLine(value4); // Invoke a void method. MethodD(); } static int MethodA() { // This method returns a constant integer. return 100; } static string MethodB(bool flag) { // This method returns a string reference based on the flag. return flag ? "cat" : "dog"; } static int MethodC(int operand1, int operand2) { // This method returns an integer based on an expression. return (operand1 * 10) + operand2; } static void MethodD() { // This method uses a return statement with no expression (void). Console.WriteLine("MethodD executed"); return; } } Output 100 cat dog 52 MethodD executed
Expression-bodied methods. Some methods that return values do not use a return statement. The C# language supports expression-bodied methods.

Tip: These methods are written more like lambda expressions. We use the lambda operator, and no "return" keyword is specified.

Instead: The result of the expression is treated as a return value. So an invisible "return" is assumed by the C# compiler.

C# program that uses expression-bodied method using System; class Program { // An expression-bodied method. static string FormatFancy(string name) => ("Name: " + name.ToUpper()); static void Main(string[] args) { // Call the FormatFancy method. string result = FormatFancy("sam"); Console.WriteLine(result); } } Output Name: SAM
Nested local function. A function can be declared as a local function. It has access to the locals within the enclosing scope—it can read and write to them.

Here: We introduce a local function called CreateString. It changes the value of "multiplier" on each call.

And: The CreateString method returns a string created with string interpolation syntax.

String Interpolation

Warning: This syntax form may be useful, but often a top-level method in a class is more standard and will be easier for others to use.

C# program that uses nested local function using System; class Program { static void Main() { int multiplier = 10; // This is a local function. // ... It can access and change local variables in the surrounding scope. string CreateString(int value) { // Use string interpolation. // ... Modify multiplier after accessing its value. return $"STRING HAS VALUE: {value * multiplier++}"; } // Call the local function. Console.WriteLine(CreateString(5)); Console.WriteLine(CreateString(5)); } } Output STRING HAS VALUE: 50 STRING HAS VALUE: 55
Void. This keyword specifies that no specific value is returned from a method. You must use "void" in the method signature. This word was inherited from older C-like languages.Void
Expressions. You could specify if-statements to compute return values, but this approach is more verbose. Expressions can instead be used to condense high-level code.
Other returns. Many programs return string references of either constant form or newly-constructed strings. String is a reference type in the language that is special-cased by the runtime.Return ArrayReturn BoolReturn Multiple Values

Tip: Like all reference types, the string type is pushed to the stack and it is only 4 or 8 bytes on computers.

String: The string data is never copied when you assign a variable to the result of the method that returns a string.

Ret. This is the IL return instruction. Ret can be executed when there is one or zero items in the evaluation stack. The evaluation stack contains varying types of elements.IL: ret

Note: If the method returns one value, the evaluation stack should have one value of that type when the ret instruction is executed.

And: If the method returns void, the evaluation stack can be empty. Serge Lidin's "Expert .NET 2.0 IL Assembler" describes these things.

Ref return. We can return a ref to a struct or array element. This allows the returned value to be modified in a single statement. These changes are reflected in the current scope.Ref Return
A summary. It is common to return values in methods. We discussed the concepts of reachability and end points, and how the execution engine processes ret instructions.
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.
Home
Dot Net Perls