Anonymous Method in C# with Examples

Anonymous methods in C# provide a way of declaring inline methods without a name, often for use as single-use delegates. Introduced in version 2.0 of the C# programming language, they present a convenient syntax for creating short snippets of code that can be passed as parameters or assigned to delegate objects. These methods are particularly useful when one desires to instantiate delegates quickly without the need to define a method elsewhere in the code explicitly.

An anonymous method in C# is defined using the delegate keyword followed by a parameter list and a method body. The ability to access local variables from the containing method scope is a key advantage, giving anonymous methods the capability to interact with the surrounding context easily. This feature simplifies code in scenarios where a full method definition would be unnecessarily verbose, such as small event handlers or simple operations passed to threading or task methods.

Anonymous Methods in C#

Anonymous methods in C# offer a concise way to define inline methods without a name. They fundamentally enhance readability and reduce the complexity of code that uses delegates.

Definition of Anonymous Methods

Anonymous methods in C# are defined using the delegate keyword and can be assigned to a delegate type variable. They have no name, hence ‘anonymous’, and can be used for creating inline methods. This feature was introduced in C# 2.0 to simplify the syntax for delegates. Here’s an example:

delegate int Operation(int x, int y);
Operation add = delegate(int a, int b)
{
    return a + b;
};
int result = add(5, 10);

In this example, add is a delegate to an anonymous method that takes two integers and returns their sum.

Advantages of Using C# Anonymous Methods

Using anonymous methods confers multiple advantages:

  • Simplicity: They reduce the need for a separate method, thus keeping related code together.
  • Maintainability: Code that uses delegates becomes easier to maintain as changes only occur in one place.
  • Flexibility: They can access local variables of the enclosing scope, which makes it easier to work with event handlers and callback methods without defining extra parameters.

Anonymous methods are particularly useful when a method is required as a parameter for another method, such as thread start methods or event handlers, where the method’s logic is only relevant in the context of the parameter usage.

Implementing Anonymous Methods in C#

Anonymous methods in C# provide a way to define inline delegate methods without the need for a separate method declaration. They often result in more concise and readable code, especially for event handling or simple delegate invocation scenarios.

Basic Syntax

Anonymous methods are defined using the delegate keyword, followed by a parameter list in parentheses and a method body enclosed in curly braces. A simple example is as follows:

delegate(int param) {
  // Method body
};

Here, the anonymous method takes a single integer parameter and contains the logic within the method body.

Delegate Declaration

Before creating an anonymous method in C#, one must declare a delegate type that matches the signature of the anonymous method. For instance, consider the following delegate declaration:

public delegate void MyDelegate(int a);

MyDelegate is a delegate type that can hold references to any method that takes a single integer parameter and returns void.

Anonymous Method Creation

Once a delegate type is declared, an anonymous method can be instantiated by assigning the delegate to a code block. Here’s an example where an anonymous method is assigned to a delegate:

MyDelegate del = delegate(int num) {
  Console.WriteLine("Anonymous method called with parameter: " + num);
};

In this case, del is now a delegate which, when invoked, will execute the code within the anonymous method. The anonymous method itself does not have a name, thus the term “anonymous”.

C# Anonymous Methods with Parameters

Anonymous methods in C# can accept parameters, similar to named methods. They are defined using the delegate keyword and can be passed or assigned to variables of a delegate type that match their signature.

Passing Parameters

An anonymous method can take parameters that are explicitly specified in its declaration. The parameters are defined within the parentheses following the delegate keyword. Here’s a basic example of an anonymous method that takes a string and an int as parameters:

delegate void ShowMessageDelegate(string message, int number);
ShowMessageDelegate showMessage = delegate(string message, int number)
{
    Console.WriteLine($"Message: {message}, Number: {number}");
};
showMessage("Hello, World!", 42);

Using Captured Variables

Anonymous methods have the ability to “capture” variables from the surrounding scope, which allows them to use these variables within their body even if they’re not passed as parameters. Captured variables maintain a reference to the variables, not the values themselves:

int capturedVariable = 10;
Action multiplyAction = delegate
{
    capturedVariable *= 2;
};

multiplyAction();
Console.WriteLine(capturedVariable); // Outputs 20

The variable capturedVariable is captured by the anonymous method and is affected by the operations inside the method.

Examples of Anonymous Methods in C#

Anonymous methods in C# provide a way of defining inline methods without a name. They can capture local variables and are often used in lieu of named delegate instances.

1. Simple Anonymous Method Example

A basic usage of an anonymous method may involve assigning it to a delegate. Below is a minimal example without any parameters:

delegate void MyDelegate();
MyDelegate myDel = delegate {
    Console.WriteLine("This is an anonymous method.");
};
myDel();

This anonymous method is related to a delegate that invokes a simple console output operation.

Here is the complete C# code:

using System;

class Program
{
    // Define delegate
    delegate void MyDelegate();

    static void Main()
    {
        // Instantiate the delegate with an anonymous method
        MyDelegate myDel = delegate {
            Console.WriteLine("This is an anonymous method.");
        };

        // Invoke the delegate
        myDel();
    }
}

After I executed the C# code using a console application using Visual Studio, you can see the output in the screenshot below.

Anonymous Method in C#

2. Anonymous Method with Parameters

Anonymous methods can accept parameters. Here is how one might declare an anonymous method that processes parameters:

delegate void MyParamDelegate(string message);
MyParamDelegate myParamDel = delegate (string msg) {
    Console.WriteLine("Received message: " + msg);
};
myParamDel("Hello with parameters!");

In this code snippet, the anonymous method takes a single string parameter and prints it to the console.

Here is the complete C# code:

using System;

class Program
{
    // Define delegate with a parameter
    delegate void MyParamDelegate(string message);

    static void Main()
    {
        // Instantiate the delegate with an anonymous method
        MyParamDelegate myParamDel = delegate (string msg) {
            Console.WriteLine("Received message: " + msg);
        };

        // Invoke the delegate with a parameter
        myParamDel("Hello with parameters!");
    }
}

Once you run the full code using Visual Studio, you can see the output like the below screenshot.

Anonymous Method in C# with Examples

3. Using Anonymous Methods in Delegates

Delegates are often used in event handling. Anonymous methods can be particularly useful for inline delegate definitions in such contexts:

// Assume a button control named 'myButton' with a Click event.
myButton.Click += delegate (object sender, EventArgs e) {
    MessageBox.Show("Button was clicked!");
};

In the above instance, the anonymous method is subscribed directly to the Click event of a button, displaying a message box when triggered.

When to Use Anonymous Methods in C#

In C#, Anonymous methods provide a concise way to define inline unnamed method bodies that can be used as delegates or expression tree types. They should be utilized when simplicity and locality of execution are paramount. For instance, they work well for simple event handling or short lambda expressions in LINQ queries.

  • Use cases include:
    • Event subscription
    • Simple LINQ queries
    • Callback methods
    • Short delegates that do not warrant a full method

However, if the method grows in complexity or is reused across different parts of an application, defining a named method is typically more appropriate for maintainability and readability.

Limitations of using Anonymous methods in C#

Anonymous methods in C# can inadvertently prolong the life of outer scope variables, leading to possible memory leaks if one is not careful with their scope and lifetime. This is particularly important with closures in which the anonymous method captures variables from the enclosing scope.

  • Common pitfalls:
    • Memory Leaks: Capturing large scope variables can lead to unintentional memory retention.
    • Performance Overheads: Excessive use in performance-critical code paths could lead to a decrease in performance due to the overhead of delegate creation.
    • Debugging Difficulty: Lack of meaningful names can make debugging more challenging.

Developers should ensure their anonymous methods are succinct and do not inadvertently capture variables that can lead to memory leaks. They need to weigh the convenience of anonymous methods against the potential performance considerations and the difficulty in debugging when the application scales.

Conclusion

Anonymous methods in C# provide a concise and functional approach to defining inline methods without the need for explicit naming. They are particularly useful when a method is to be used only once, and its declaration elsewhere in the code would lead to unnecessary complexity.

FeatureUse
SimplicityAvoids the need for separate method declarations when a simple, one-off functionality is required.
ReadabilityMaintains cleaner, more readable code by reducing clutter and keeping related logic in close proximity.

It’s important to ensure that anonymous methods are used only when they improve the readability and maintainability of the code, as they can sometimes obscure the flow of execution if overused. Performance-wise, they are comparable to lambda expressions and local methods, offering a negligible overhead in most scenarios.

In this C# tutorial, I have explained everything about the anonymous methods in C#. Various examples of where to use C# anonymous methods.

You may also like: