13,288,306 members (53,254 online)
alternative version

#### Stats

40.7K views
16 bookmarked
Posted 22 Apr 2008

# Nested Functions in C#

, 22 Apr 2008
 Rate this:

## Introduction

We all have heard of nested classes, nested namespaces. Have we ever heard of nested functions??? Can we write a nested function in C#???

The answer is Yes, we can write a nested function in C# using `delegate`s. This article deals with writing nested methods in C#. Knowledge of `delegate`s is required. For creating nested methods, we write anonymous methods and associate `delegate`s with them.

## Using the Code

For writing a nested function in C#, we would make use of `delegate`s and anonymous functions. A `delegate` is nothing but a "function pointer". And an anonymous function is a function/method without a name. Below, we are declaring a `delegate` which will point to an anonymous function.

```// Declare a delegate which will point to different anonymous methods.
public delegate long FactorialDelegate(long n);        ```

After declaring the `delegate`, we will write the anonymous functions as given below:

```// This method defines anonymous functions.
public static void FunctionInFunction()
{
// Nested function.
FactorialDelegate FactorialMethod = delegate(long number)
{
if (number < 1)
throw new ArgumentOutOfRangeException(
"n", "Argument must be greater than 0!");

long result = 1;

// Calculate factorial
for (int iterator = 1; iterator <= number; iterator++)
result *= iterator;

return result;
};

// Nested function with recursion.
FactorialDelegate FactorialRecursive = delegate(long number)
{
if (number < 1) throw new
ArgumentOutOfRangeException(
"n", "Argument must be greater than 0");

// The current method will always be at the 0th frame on the stack.
MethodBase method = new StackTrace().GetFrame(0).GetMethod();

return number > 1 ? number * (long)method.Invoke(null,
new object[] { number - 1 }) : number;
};

Console.WriteLine("Factorial for 5 = " + FactorialMethod(5));

Console.WriteLine("Factorial for 10 = " + FactorialRecursive(10));
}```

In the above example, we have declared a `delegate` and in the method `FunctionInFunction`, we are associating that `delegate` with two anonymous methods we defined. The first one is a normal method and the second anonymous method is recursive in nature. In the recursive method, we have used reflection to get the recursive method name, i.e. invoking this method. The current method will always be on the frame `0` of the stack trace.

Some properties of anonymous methods are as follows:

• It is an error to have a `jump `statement, such as `goto`, `break`, or `continue`, inside the anonymous method block whose target is outside the block. It is also an error to have a `jump `statement, such as `goto`, `break`, or `continue`, outside the anonymous method block whose target is inside the block.
• Unlike local variables, the lifetime of the outer variable (outer variable is a variable declared local to the outside wrapper function) extends until the `delegate`s that reference the anonymous methods are eligible for garbage collection.
• An anonymous method cannot access the `ref `or `out `parameters of an outer scope.
• No unsafe code can be accessed within the anonymous-method-block.

## Points of Interest

This is a wonder that we can do with `delegate`s.

## History

• 23rd April, 2008: Initial post

## Share

 Software Developer (Senior) United States
Sandeep has 9+ yrs of IT experience. He is Microsoft Certified Technology Specialist and has been certified for Analyzing Requirements and Defining Microsoft .NET Solution Architectures.
He is an active member of:
1. MSDN Forums
2. CodeProject.com
3. Community-Credit.com
4. Blogspot.com

My Blog

## You may also be interested in...

 First Prev Next
 It doesn't seem worth the trouble PIEBALDconsult23-Apr-08 18:32 PIEBALDconsult 23-Apr-08 18:32
 Why stay at the 0th frame of the stack? elektrowolf23-Apr-08 4:45 elektrowolf 23-Apr-08 4:45
 Re: Why stay at the 0th frame of the stack? johannesnestler23-Apr-08 5:05 johannesnestler 23-Apr-08 5:05
 Re: Why stay at the 0th frame of the stack? elektrowolf23-Apr-08 7:46 elektrowolf 23-Apr-08 7:46
 It's not called a nested function `leppie`23-Apr-08 4:19 `leppie` 23-Apr-08 4:19
 Brilliant! Nick Butler23-Apr-08 3:35 Nick Butler 23-Apr-08 3:35
 It is not true as it seems J@@NS22-Apr-08 23:22 J@@NS 22-Apr-08 23:22
 Re: It is not true as it seems `leppie`23-Apr-08 4:11 `leppie` 23-Apr-08 4:11
 Last Visit: 31-Dec-99 19:00     Last Update: 11-Dec-17 4:27 Refresh 1

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Web02 | 2.8.171207.1 | Last Updated 23 Apr 2008
Article Copyright 2008 by Sandeep Aparajit