Delegate declaration and instantiation in C Sharp (C#) - Time & Space Complexity
When we declare and create delegates in C#, it's important to know how the time to do this grows as we add more delegates.
We want to understand how the work changes when we create more delegate instances.
Analyze the time complexity of the following code snippet.
delegate void SimpleDelegate();
void Method() { }
SimpleDelegate[] delegates = new SimpleDelegate[n];
for (int i = 0; i < n; i++)
{
delegates[i] = new SimpleDelegate(Method);
}
This code creates an array of delegates and fills it by creating a new delegate instance for each element.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating a new delegate instance inside a loop.
- How many times: Exactly
ntimes, once for each element in the array.
As the number of delegates n increases, the total work grows directly with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 delegate creations |
| 100 | 100 delegate creations |
| 1000 | 1000 delegate creations |
Pattern observation: The work grows in a straight line as we add more delegates.
Time Complexity: O(n)
This means the time to create all delegates grows directly with the number of delegates you want to create.
[X] Wrong: "Creating multiple delegates at once is a constant time operation regardless of how many delegates."
[OK] Correct: Each delegate creation takes time, so doing it many times adds up linearly, not instantly.
Understanding how delegate creation scales helps you reason about event handling and callbacks in real applications, showing you can think about performance even in simple code.
"What if we reused the same delegate instance for all array elements instead of creating new ones? How would the time complexity change?"
Practice
Solution
Step 1: Understand delegate purpose
A delegate is a type that holds references to methods with a matching signature.Step 2: Compare options to definition
Only To hold references to methods with a specific signature correctly describes this purpose; others describe unrelated concepts.Final Answer:
To hold references to methods with a specific signature -> Option BQuick Check:
Delegate = method reference holder [OK]
- Confusing delegates with variables
- Thinking delegates create classes
- Assuming delegates store simple values
Solution
Step 1: Recall delegate declaration syntax
The correct syntax is: delegate returnType DelegateName(parameterList);Step 2: Match syntax to options
delegate void MyDelegate(int number); matches this exactly: delegate void MyDelegate(int number); others have incorrect order or types.Final Answer:
delegate void MyDelegate(int number); -> Option DQuick Check:
delegate returnType Name(params) = delegate void MyDelegate(int number); [OK]
- Placing 'void' before 'delegate'
- Swapping delegate name and return type
- Using 'void' as parameter type
delegate int Operation(int x, int y);
class Program {
static int Add(int a, int b) => a + b;
static void Main() {
Operation op = Add;
Console.WriteLine(op(3, 4));
}
}
Solution
Step 1: Understand delegate assignment
The delegate 'Operation' matches the method 'Add' signature (two ints, returns int), so 'op' points to 'Add'.Step 2: Evaluate delegate invocation
Calling 'op(3, 4)' calls 'Add(3, 4)', which returns 3 + 4 = 7.Final Answer:
7 -> Option CQuick Check:
Delegate calls Add(3,4) = 7 [OK]
- Thinking delegate concatenates numbers
- Expecting string output
- Assuming compile error due to delegate
delegate void Printer(string message);
class Program {
static void PrintMessage() { Console.WriteLine("Hello"); }
static void Main() {
Printer p = PrintMessage;
p("Hi");
}
}
Solution
Step 1: Compare delegate and method signatures
The delegate 'Printer' expects a method with a string parameter and void return type.Step 2: Check method signature
'PrintMessage' has no parameters, so it does not match the delegate signature.Final Answer:
PrintMessage method signature does not match delegate -> Option AQuick Check:
Delegate and method signatures must match [OK]
- Ignoring parameter mismatch
- Thinking delegate needs parentheses on assignment
- Assuming delegate must return a value
delegate bool Filter(int value);
Which of the following correctly instantiates the delegate to a method that returns true if the number is even?
Solution
Step 1: Understand delegate signature
'Filter' expects a method taking an int and returning a bool.Step 2: Check each option's return type and logic
Filter f = x => x % 2 == 0; returns true if x is even (x % 2 == 0), matching bool return.
Filter f = (int x) => { return x * 2; }; returns int, not bool.
Filter f = delegate(int x) { Console.WriteLine(x); }; returns void (no return), invalid.
Filter f = x => x + 2 == 0; returns bool but checks x + 2 == 0, which is not the even check.Final Answer:
Filter f = x => x % 2 == 0; -> Option AQuick Check:
Delegate needs bool return matching even check [OK]
- Returning wrong type (int instead of bool)
- Missing return statement in anonymous method
- Incorrect condition for even check
Ready to prove it?
Pass the test and this pattern moves unknown
