C# Delegates Interview Questions and Answers

C# Delegates Interview Questions and Answers
May 25, 2023
29 minutes read

What is the difference between anonymous methods and lambda expressions when working with delegates in C#?

Answer

Anonymous methods and lambda expressions are both mechanisms to provide inline implementations of a method or function when working with delegates. They allow you to create functions without defining a named method, making it easier to create delegate instances. However, there are significant differences between the two.

Anonymous methods:

  • Introduced in C# 2.0.
  • Defined using the delegate keyword, followed by a method body enclosed in brackets {}.
  • Allows access to outer variables and can modify their values.
  • Cannot contain expression-bodied definitions – the method body must be a statement block.
  • Cannot infer input parameter types – you must explicitly declare them.
  • Supports a limited subset of C# features when defining the method body.

Example:

Loading code snippet...

Lambda expressions:

  • Introduced in C# 3.0.
  • Defined using the => (lambda operator), followed by a method body (either as an expression or a statement block).
  • Allows access to outer variables but creates a closure when modifying their values, limiting the risks of side effects.
  • Supports expression-bodied definitions, making it more concise.
  • Can infer input parameter types if they can be deduced by the compiler.
  • Supports most C# features when defining the method body.

Example (expression-bodied):

Loading code snippet...

Example (statement-bodied):

Loading code snippet...

In summary, lambda expressions are more concise and versatile than anonymous methods, but both should be used when the context requires a function without defining a named method. Choose lambda expressions for most scenarios, and consider anonymous methods when working with legacy code or in situations where lambda expressions are not supported.

How does C# implement event handling using delegates, and what are the best practices for using events with delegates?

Answer

In C#, events are a mechanism that enables a class (the publisher) to notify other classes (subscribers) when something interesting happens. Events are based on delegates, which provide a type-safe way to encapsulate method signatures, allowing the publisher to call subscriber methods without knowing the exact implementation.

Implementing event handling using delegates:

  • Define a delegate type that matches the signature of the event handler methods.
  • Declare the event within the publisher class using the delegate type and the event keyword.
  • In the subscriber class, create methods with the same signature as the delegate type, and register/unregister them to the event exposed by the publisher.
  • In the publisher class, define a method that raises the event by invoking the delegate instance after checking if it is not null (to ensure there are subscribers).

Best practices for using events with delegates:

  • Use the EventHandler<TEventArgs> delegate type for event handlers when possible, to follow the recommended standard signature (with sender and eventArgs parameters).
  • Always check if the event delegate is not null before invoking it, to ensure at least one subscriber exists.
  • Consider using the null-conditional operator (?.) to simplify the event invocation code.
  • Protect event registration and unregistration with appropriate synchronization mechanisms (e.g., using lock statements) to prevent race conditions in multi-threaded scenarios.
  • If necessary, implement custom add and remove event accessor methods to provide more control over how subscribers are added or removed.
  • Follow the .NET Framework naming conventions and guidelines for declaring events (e.g., use the EventHandler suffix for delegate types, and the EventArgs suffix for event argument classes).

Example:

Loading code snippet...

How can you ensure that exceptions thrown within a multicast delegate invocation do not halt the execution of the remaining delegate chain?

Answer

A multicast delegate is a delegate that can have multiple methods attached to its invocation list. When a multicast delegate is invoked, it calls each method in the list sequentially. If any of those methods throw an exception, the execution of the remaining methods in the list is halted.

To ensure the execution of the remaining delegate chain, you can use a try-catch block inside each attached method or create a separate method that handles exception handling for all delegates in the chain. The latter option is preferred, as it allows you to centralize the exception handling logic.

Here’s an example of how to centralize the exception handling for a multicast delegate:

Loading code snippet...

In this example, the ExecuteWithExceptionHandling method iterates over the invocation list of the multicast delegate and invokes each single delegate instance inside a try-catch block. This way, if any of them throw an exception, it will be caught and handled, and the execution continues with the next delegate in the list.

What are the differences between Func, Action, and Predicate delegate types in C#, and how do they relate to generic delegates?

Answer

Func, Action, and Predicate are predefined generic delegate types provided by the .NET Framework to simplify the creation of delegate instances with different method signatures. They eliminate the need to define a custom delegate type for each delegate instance you want to create.

Func:

  • Represents a method that takes zero to 16 input parameters and returns a value.
  • It is a generic type with 1 to 17 type parameters, where the last type parameter represents the return type, and the others represent the input parameters.
  • Useful when you need a delegate for a method that has a return value (not void).

Example:

Loading code snippet...

Action:

  • Represents a method that takes zero to 16 input parameters and returns no value (void).
  • It is a generic type with 0 to 16 type parameters, representing the input parameters.
  • Useful when you need a delegate for a method that performs an action and doesn’t have a return value.

Example:

Loading code snippet...

Predicate:

  • Represents a method that takes a single input parameter and returns a boolean value (true or false).
  • It is a generic type with a single type parameter, representing the input parameter.
  • Useful when you need a delegate for a method that checks a condition on its input and returns a boolean.

Example:

Loading code snippet...

These generic delegate types simplify the implementation of common patterns requiring delegate instances, by providing a set of reusable delegate types that cover most commonly used method signatures. Using Func, Action, and Predicate instead of custom delegate types makes your code more concise, increases its readability, and reduces the maintenance overhead.

How are delegate inference and method group conversion used in C# to simplify delegate instantiation?

Answer

Delegate inference and method group conversion are two language features provided by C# to simplify and shorten the instantiation of delegate instances. They allow you to create delegates without explicitly creating a new delegate instance or specifying the method signature.

Delegate inference:

  • Allows the creation of a delegate instance without explicitly specifying the method signature when using a lambda expression or an anonymous method.
  • The compiler infers the required delegate type based on the context in which it is used.
  • Both anonymous methods and lambda expressions can benefit from delegate inference.

Example with lambda expression:

Loading code snippet...

Method group conversion:

  • Allows the creation of a delegate instance from a named method without explicitly creating a new delegate instance.
  • The compiler infers the required delegate type based on the context in which it is used and the named method’s signature.
  • The named method must have a compatible signature with the target delegate type.

Example:

Loading code snippet...

By using delegate inference and method group conversion, you can make your code shorter, more concise, and more readable, allowing the compiler to handle the complexities of instantiating delegate instances with the proper types and method signatures.


As we explore more complex questions about C# Delegates, it’s essential to understand their relationship with event handling and asynchronous programming.

This next set of questions will dive further into these topics, discussing best practices and introducing advanced scenarios that may arise in real-world situations. By mastering these concepts, you’ll bolster your C# expertise and be better prepared for any challenge that comes your way.


Explain the performance implications of using delegates in C#, and how you can optimize your code to minimize their impact?

Answer

Delegates, by design, introduce an additional level of indirection when calling methods in C#. While the performance impact of using delegates is generally small, it can become significant in performance-critical scenarios or when using a substantial number of delegate instances. Some of the performance implications of using delegates are:

  • Memory overhead: Each delegate instance consumes memory, which increases the load on the garbage collector and, in turn, the overall memory consumption of your application.
  • Invocation cost: Calling a method through a delegate is generally slower than invoking a method directly due to the additional level of indirection.
  • Allocation cost: Instantiating a new delegate instance involves memory allocation and object creation, which consumes additional CPU cycles and increases the pressure on the garbage collector.

To optimize your code and minimize the performance impact of delegates:

  • Reuse delegate instances: When possible, avoid creating new delegate instances, and consider reusing existing instances. Keep a reference to the delegate instance and use it across multiple invocations if it leads to the same result.
  • Use static methods: Prefer using static methods as delegate targets when possible, as they require less memory overhead and are generally faster to execute than instance methods.
  • Consider alternatives: Evaluate whether using delegates is the most efficient solution for your given scenario. If the use of delegates is negatively impacting your application’s performance, consider using alternative methods such as direct method calls or interfaces.
  • Profile and benchmark: Examine your application’s performance characteristics using profiling tools to identify performance bottlenecks and areas of improvement specifically related to delegate usage.
  • Opt-in to inlining: In some specific scenarios, using the [MethodImpl(MethodImplOptions.AggressiveInlining)] attribute on target methods might improve delegate invocation performance by inlining the method. However, this should be used carefully, as it can increase the code size and negatively affect performance in other cases.

By applying these optimizations, you can minimize the performance impact of delegates in your C# applications and ensure efficient code execution. Always use proper monitoring and performance analysis tools to identify potential performance bottlenecks and optimize where necessary.

How do you decouple a publisher and a subscriber using delegates while implementing the Observer design pattern in C#?

Answer

The Observer design pattern is used to create a one-to-many dependency between a subject (publisher) and its observers (subscribers), so when the subject state changes, all observers are notified. Delegates can be utilized to implement the Observer pattern in C#, ensuring loose coupling between publishers and subscribers.

To decouple the publisher and the subscriber using delegates, follow these steps:

  • Define a delegate type that matches the signature of the event handler methods.
  • Declare the event within the publisher class using the delegate type and the event keyword.
  • Create event handler methods in the subscriber class with the same signature as the delegate type.
  • Register (subscribe) and unregister (unsubscribe) the event handler methods to the event exposed by the publisher.
  • In the publisher class, define a method that raises the event by invoking the delegate instance after checking if it is not null (to ensure there are subscribers).

Example:

Loading code snippet...

In this example, the WeatherStation class (publisher) exposes a TemperatureChanged event using a delegate. The TemperatureDisplay class (subscriber) implements an event handler (OnTemperatureChanged) that conforms to the delegate signature. The subscriber registers the event handler to the publisher’s event, and when the publisher raises the event, the subscriber’s method is invoked.

This implementation decouples the publisher and subscriber, as they only need to agree on the delegate signature. The publisher does not need to be aware of the subscriber’s implementation, and the subscriber only needs a reference to the publisher’s event.

How are async/await keywords used with delegates to simplify asynchronous code execution in C#?

Answer

The async and await keywords in C# provide a simple and readable way to execute asynchronous code without explicitly managing thread synchronization or callback mechanisms. Delegates can be used as the target of the async and await keywords to asynchronously invoke a method, whether it’s an instance method, static method, or a lambda expression.

To use async and await with delegates:

  • Define a delegate type that matches the signature of the asynchronous method.
  • Mark the target method with the async keyword and return a Task or Task<TResult> object.
  • Use the await keyword when invoking the delegate.

Example:

Loading code snippet...

In this example, an AsyncDownloadDelegate delegate is defined with a signature that matches the asynchronous DownloadAsync method. The DownloadAsync method is marked with the async keyword and returns a Task. The delegate is invoked using the await keyword, which allows the calling code to asynchronously wait for the method execution to complete.

By leveraging async and await with delegates, you can develop cleaner and more readable asynchronous code, while taking advantage of the type safety provided by the delegate mechanisms in C#.

Answer

A closure in C# is a feature where an anonymous function (either an anonymous method or a lambda expression) can capture and access variables from its surrounding scope. When a delegate is created based on an anonymous function that contains a closure, the delegate retains a reference to the captured variables, even if the surrounding scope has exited. This behavior enables the delegate to access and manipulate the captured variables during its execution.

Potential pitfalls related to captured variables:

  • Unintended side effects: As the captured variables are shared between the closure and the original scope, changes to the variable’s value within the closure will also affect the original value in the outer scope, potentially leading to unintended side effects.
  • Lifetime extension: Captured variables extend their lifetime to match the lifetime of the delegate, which may lead to higher memory consumption if the delegate is long-lived.
  • Concurrency issues: If the delegate is invoked concurrently by multiple threads, there is a risk of race conditions and data corruption when accessing or modifying captured variables. Proper synchronization mechanisms should be used to prevent such issues (e.g., locks, semaphores, or thread-safe collections).

Example of a closure:

Loading code snippet...

In this example, the CreateCounter method returns a Func<int> delegate with a lambda expression that captures the local count variable. When the delegate is invoked, it increments the captured count variable, even though the CreateCounter method scope has exited.

To avoid pitfalls when using closures and delegates, carefully consider the interaction between the captured variables and the delegate’s execution. Ensure proper synchronization in multi-threaded scenarios and be mindful of potential side effects caused by shared captured variables.

How does C# implement event handling using delegates, and what are the best practices for using events with delegates?

Answer

In C#, events are a special kind of multicast delegate that can have multiple subscribers. They provide a standard mechanism for encapsulating the event-driven programming pattern, where a publisher raises events, and subscribers react to those events. Events are declared using the event keyword, and their underlying delegate type defines the event’s signature.

Event handling implementation:

  • Define a delegate type that represents the event’s signature (input parameters and return type).
public delegate void EventHandlerDelegate(string message);
  • Declare an event using the event keyword and the delegate type.

Loading code snippet...

  • Implement the event invocation logic in the publisher, invoking the delegate when the event is raised.

Loading code snippet...

  • Create subscribers that will handle the event. The subscriber methods must match the event’s delegate signature.

Loading code snippet...

  • Register the subscribers to the event.

Loading code snippet...

Best practices for using events with delegates:

  • Use the EventHandler<TEventArgs> standard generic delegate type for events that have data to pass to subscribers.
  • Implement the Event Design Guidelines recommended by Microsoft, such as using EventArgs for event data and sender as the first parameter.
  • Protect the event from being raised by external classes by making it private or by wrapping it in a custom accessor method.
  • Always check for null before invoking the delegate backing the event, using the null-conditional operator (?.) or a null check.
  • Use the += and -= operators to subscribe and unsubscribe from events, respectively.

By following these best practices and implementing events using delegates, you can effectively use the event-driven programming pattern in your C# applications, resulting in decoupled and maintainable code.


With a solid foundation in event handling and asynchronous programming, it’s time to dive into more advanced scenarios using C# Delegates. These questions will not only test your technical know-how but also your ability to think critically and employ best practices when working with Delegates.

Get ready to explore topics such as DynamicMethod, memory management, and more as you journey further into the world of C# Delegates.


How can you ensure that exceptions thrown within a multicast delegate invocation do not halt the execution of the remaining delegate chain?

Answer

When invoking a multicast delegate, the invocation list (chain of delegate instances) is executed sequentially. If one of the methods in the invocation list throws an exception, the remaining methods in the list are not executed, and the exception propagates to the calling code.

If you want to prevent exceptions from halting the execution of the delegate chain, you can manually iterate through the invocation list using the GetInvocationList method and invoke each delegate in a try-catch block. This ensures that exceptions thrown by one subscriber won’t stop the execution of the remaining subscribers.

Loading code snippet...

Note that this approach should be used with caution, as it may result in an unexpected program behavior if exceptions are silently caught, and subscribers are not notified about the errors that occurred during event handling. It is essential to provide proper error handling and logging mechanisms to ensure that errors are addressed and fixed as needed.

Answer

Closures are a language feature that allows you to “capture” variables from the surrounding context (e.g., local variables, method parameters) inside a nested anonymous function such as a lambda expression or an anonymous method. Closures enable delegates to access and modify the captured variables even after the method that created the delegate has finished executing.

Loading code snippet...

In the example above, the count variable is captured from the outer method and can be accessed and modified by the delegate counter.

Potential pitfalls related to captured variables:

  • Unexpected behavior: When multiple delegates capture the same variable, changes made by one delegate can affect the others, leading to unexpected results.

Loading code snippet...

  • Memory leaks: Captured variables remain in memory, extended their lifetime for as long as the delegate remains referenced or rooted. This can lead to memory leaks if you don’t carefully handle the references to the delegate instances.
  • Concurrency issues: When using closures in multi-threaded scenarios, you need to be cautious about potential race conditions and synchronization issues when multiple threads access and modify the captured variables.

By understanding how closures work and being aware of potential pitfalls, you can take the appropriate measures to avoid unwanted side effects and ensure the correct behavior of your delegates when working with captured variables in C#.

Describe the security implications of using delegates, and how you can mitigate some of the associated risks?

Answer

Delegates, being function pointers, can introduce potential security risks in your C# applications if not used correctly or safely. Some key security implications of using delegates include:

  • Execution of unauthorized methods: Delegates can potentially call methods that were not intended to be exposed or executed when permissions or accessibility are not properly enforced. This could allow for unauthorized access to sensitive data or unauthorized behavior in the application.
  • Tampering with delegates: Delegates may be exposed to potential tampering or modification by malicious code, altering their intended behavior or executing malicious actions.

To mitigate these risks associated with delegates, follow the best practices below:

  • Restrict delegate targets: Ensure that delegate targets (methods) have the appropriate access modifiers (e.g., private, internal) to restrict their visibility, preventing unauthorized access.
  • Validate delegate instances: When accepting delegates as method parameters, validate that the provided delegate instance contains the appropriate target method(s) before invoking it.
  • Use events to encapsulate delegates: Use events to wrap delegates in the publisher-subscriber pattern, providing better encapsulation and protecting against unauthorized invocation or tampering.
  • Beware of method group conversion: Be cautious when using method group conversion to create delegates, as it automatically binds the delegate instance to the target method without explicitly validating its signature or access level.

Loading code snippet...

By implementing these best practices and being mindful of the potential security risks related to delegates, you can develop more secure C# applications.

How do you implement the Callback pattern in C# using delegates?

Answer

The Callback pattern is a behavioral design pattern that allows a called method to notify completion or progress back to the caller via a function or method. In C#, the Callback pattern can be implemented using delegates.

To implement the Callback pattern with delegates, follow these steps:

  • Define a delegate type that represents the callback’s signature.

Loading code snippet...

  • Define the method that will be called and include a parameter of the delegate type.

Loading code snippet...

  • Create a callback method that matches the delegate’s signature.

Loading code snippet...

  • Invoke the method with the callback.

Loading code snippet...

By using delegates for the Callback pattern, you can efficiently create flexible, decoupled components that can interact with each other and react to specific completion or progress events.

What are the key differences between using a MethodInvoker delegate and a custom delegate type for invoking methods on the main UI thread in a WinForms application?

Answer

In a WinForms application, updating the UI components must be done by the UI thread (main thread). Attempting to update the UI from a different thread will result in a CrossThreadOperationException. You can use the MethodInvoker delegate or a custom delegate type to invoke methods on the main UI thread.

MethodInvoker delegate:

  • A predefined delegate provided by the WinForms namespace.
  • Requires no input parameters and returns no value (void).
  • Provides a simple way to invoke methods on the UI thread when you don’t need to pass any parameters or get return values.

Example using MethodInvoker:

Loading code snippet...

Custom delegate type:

  • Allows you to specify input parameters and a return type.
  • Enables more complex interactions and data exchange with the UI thread.

Example using custom delegate:

Loading code snippet...

The key differences between using MethodInvoker and a custom delegate type for invoking methods on the main UI thread in a WinForms application are the simplicity and flexibility they provide. The MethodInvoker delegate is more straightforward to use when no parameters or return values are needed, while a custom delegate type offers more control and customizability when interacting with the UI thread.


Having gained a deeper understanding of advanced scenarios in C# Delegates, it’s time to put your skills to the test with some intricate questions. These questions will challenge your knowledge in critical areas, such as the creation and management of runtime-defined methods, garbage collection, and memory management.

As you tackle these problems, remember to consider best practices and the potential implications of your solutions on application performance.


How does C# implement event handling using delegates, and what are the best practices for using events with delegates?

Answer

Events in C# are a mechanism to provide notifications to multiple subscribers when something happens in the publisher. Delegates are the foundation of event handling in C#. They provide a type-safe way to define a function pointer that can be used to invoke methods at runtime. Events act as wrappers around delegates, encapsulating them and allowing only specific operations such as subscription and unsubscription.

To implement event handling with delegates in C#, follow these steps:

  • Define a delegate type that represents the event handler’s signature.

Loading code snippet...

  • Define an event with the delegate type.

Loading code snippet...

  • Raise the event by invoking the delegate.

Loading code snippet...

  • Create a method that matches the delegate’s signature to handle the event.

Loading code snippet...

  • Subscribe to the event.

Loading code snippet...

  • Unsubscribe from the event.

Loading code snippet...

Best practices for using events with delegates:

  • Use EventHandler<TEventArgs> delegate type whenever possible. This simplifies event handling and allows more standardized event arguments.

Loading code snippet...

  • Create a separate EventArgs derived class for custom event data, where CustomEventArgs is a class derived from EventArgs.
  • Always check for null before raising an event using the null-conditional operator ?..
  • Prefer raising events through a protected virtual method (like OnMyEvent in the example). This allows derived classes to handle or modify the event propagation.
  • Follow the naming conventions: {EventName} for the event, and On{EventName} for the handler method.
  • Use the -= and += operators to unsubscribe and subscribe (respectively) to events, which prevents unintended duplicate subscriptions.

How can you ensure that exceptions thrown within a multicast delegate invocation do not halt the execution of the remaining delegate chain?

Answer

When invoking a multicast delegate, if an exception occurs within the execution of one of the targets, the subsequent targets in the invocation list will not be executed. To ensure that the remaining delegates in the chain are executed even if an exception occurs, you can manually iterate through the invocation list and call each target individually, handling any exceptions they might throw:

Loading code snippet...

By manually invoking each delegate in the multicast event’s invocation list and handling exceptions within the loop, you can ensure that the execution of the remaining delegate chain is not halted due to an exception.

What are the differences between Func, Action, and Predicate delegate types in C#, and how do they relate to generic delegates?

Answer

Func, Action, and Predicate are generic delegate types provided by the C# language that represent common method signatures, making it easier to work with delegates without having to define custom delegate types.

Func:

  • Represents a method that takes one or more input parameters and returns a value.
  • The last type parameter represents the return type, while the others represent input parameters.

Loading code snippet...

Action:

  • Represents a method that takes one or more input parameters and does not return a value (void return type).

Loading code snippet...

Predicate:

  • Represents a method that takes an input parameter and returns a boolean value.
  • Typically used to express conditions or validations.

Loading code snippet...

All three delegate types (Func, Action, and Predicate) are related to generic delegates as they use generics to allow for more flexible and reusable code. By using these built-in generic delegate types, developers can reduce the need to create custom delegates while still maintaining strong typing and readability.

How do the concepts of garbage collection and memory management apply to delegate instances in C#?

Answer

Delegates in C# are managed objects that reside on the heap, similar to other reference types. As a result, they are subject to garbage collection and memory management by the .NET runtime.

Here are some key points to consider when thinking about garbage collection and memory management in relation to delegate instances:

  • When a delegate instance goes out of scope and is no longer accessible, it becomes eligible for garbage collection.
  • If a delegate instance is used as an event handler and is subscribed to an event, there is a reference from the event publisher to that delegate. This reference prevents the delegate from being garbage collected as long as the publisher is alive, which can lead to potential memory leaks. To avoid this, it is essential to unsubscribe from events (using the -= operator) when they are no longer needed.
  • Multicast delegates hold references to multiple target methods. As long as there are references to a multicast delegate, none of the target methods will be eligible for garbage collection.
  • Be cautious when using closures, as they capture the surrounding local variables or parameters. This can extend the lifetime of those variables, causing them to be potentially held in memory longer than expected, which can lead to memory pressure issues.
  • When using weak event patterns or weak delegates, you can allow garbage collection to occur without specifically unsubscribing from the event. However, the implementation of such patterns is non-trivial and should be done with proper understanding of garbage collection mechanics in C#.

In C#, how can you implement a dynamic, runtime-defined method call using delegates with the help of the DynamicMethod class and Reflection.Emit namespace?

Answer

The DynamicMethod class and Reflection.Emit namespace in C# can be used to create methods at runtime and execute them using delegates. This allows greater flexibility in code execution and can be useful in scenarios where method behavior must be generated based on runtime inputs or conditions.

Here is a step-by-step guide to implementing a dynamic, runtime-defined method call using delegates with the help of the DynamicMethod class and Reflection.Emit namespace:

  • Add the required namespace references.

Loading code snippet...

  • Define a delegate with a matching method signature.

Loading code snippet...

  • Create a dynamic method using the DynamicMethod class. Set its return type, parameter types, and optional attributes like visibility and ownership.

Loading code snippet...

  • Generate the method’s IL (Intermediate Language) code using the ILGenerator class, which is returned by the GetILGenerator method of DynamicMethod.

Loading code snippet...

  • Emit the IL code for method implementation using the various methods available in the ILGenerator class.

Loading code snippet...

  • Create a delegate instance of the dynamic method.

Loading code snippet...

  • Invoke the dynamic method using the delegate instance.

Loading code snippet...

Using this approach, you can create and invoke dynamic methods at runtime by generating their IL code and using delegates to simplify the execution process.

Congratulations on making it through these challenging C# Delegates interview questions and answers! Demonstrating your knowledge in event handling, asynchronous programming, advanced scenarios, best practices, DynamicMethod and memory management, you’ve surely honed your expertise.

C# Delegates are a critical aspect of modern .NET applications, and your ability to understand and implement them effectively ensures you’re well-equipped for success. Keep learning, practicing, and deepening your knowledge to become an even more accomplished C# developer.

Good luck, and may your pursuit of mastery in C# Delegates be a rewarding one!

You May Also Like

Optional Parameters in C#: What You Need to Know

Optional Parameters in C#: What You Need to Know

Programming in C# often requires flexibility and simplicity ...

What is Lock Keyword in C#? Main Usages

What is Lock Keyword in C#? Main Usages

IndexUnderstanding the C# Lock Keyword Can’t tell a lock fro...

Enumerate in C#: Detailed Explanation

Enumerate in C#: Detailed Explanation

Desperate to decode the mystery that is enumeration in C#? I...

Creating a JSON Class in C#: Detailed Guide

Creating a JSON Class in C#: Detailed Guide

In the world of application development, manipulation of dat...

Static Class in C#: How to Use It?

Static Class in C#: How to Use It?

Hello there, future C# aficionado! It’s time to roll down th...

DateTime Formatting in C#: Dev Guide

DateTime Formatting in C#: Dev Guide

Have you ever gotten frustrated handling dates and times in ...

Leave a reply

Loading comment form...