0% found this document useful (0 votes)
6 views3 pages

C# Key Concepts Interview Guide

Uploaded by

dubeypoorab
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views3 pages

C# Key Concepts Interview Guide

Uploaded by

dubeypoorab
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

C# Key Concepts - Quick Interview Guide

Class

Definition: Reference type that defines data and behavior.


Usage: Used to model objects like Person or Car.
Example:
class Person { public string Name; public void Speak() => [Link]("Hi"); }

Struct

Definition: Value type used to store small related data.


Usage: Used for lightweight data like Point or Color.
Example:
struct Point { public int X, Y; }

Enum

Definition: Value type representing a set of named constants.


Usage: Used for days, statuses, roles.
Example:
enum Days { Sunday, Monday, Tuesday }

Delegate

Definition: Holds reference to methods with a specific signature.


Usage: Used for callbacks, events.
Example:
delegate void Greet(string name);

Interface

Definition: Defines a contract with method/property signatures.


Usage: Used for abstraction, DI.
Example:
interface IDrive { void Start(); }

Record

Definition: Immutable reference type with value-based equality.


Usage: Used for data models.
Example:
record Person(string Name, int Age);

Fields

Definition: Variables inside a class holding data.


C# Key Concepts - Quick Interview Guide

Usage: Used to store object's state.


Example:
public int age; private string name;

Methods

Definition: Define the actions/behavior of a class.


Usage: Used for reusable logic.
Example:
public void Greet() { [Link]("Hello"); }

Constructors

Definition: Special method that initializes a class.


Usage: Used to set initial values.
Example:
public Person(string name) { [Link] = name; }

Finalizers

Definition: Called when an object is garbage collected.


Usage: Used to release unmanaged resources.
Example:
~Person() { [Link]("Destroyed"); }

Properties

Definition: Provide controlled access to fields.


Usage: Used for encapsulation.
Example:
public string Name { get; set; }

Indexers

Definition: Allow object to be accessed like an array.


Usage: Used in custom collections.
Example:
public string this[int index] { get { return data[index]; } set { data[index] = value; } }

Events

Definition: Notify other classes when something happens.


Usage: Used in UI or pub-sub pattern.
Example:
public event Action OnClick;
C# Key Concepts - Quick Interview Guide

Deconstructors

Definition: Break an object into its parts.


Usage: Used in tuple deconstruction.
Example:
public void Deconstruct(out string name, out int age) { name = [Link]; age = [Link]; }

Common questions

Powered by AI

In C#, interfaces define a contract with method and property signatures, allowing different classes to implement the same operations without dictating how they should perform them . This abstraction layer facilitates dependency injection (DI) by allowing components to be more easily substituted without changing the dependent objects' code, which only relies on the interface. The key benefits of employing interfaces for DI include increased modularity, as the implementation details can vary without affecting the rest of the system, and improved testability, as mock implementations can be injected during unit tests. Furthermore, interfaces enhance maintainability and flexibility, enabling components to be upgraded or swapped out for new implementations with minimal impact .

Indexers in C# allow an object to be indexed in a manner similar to arrays, providing a way to access elements of a custom collection using the array access syntax without exposing the underlying data structure . This can simplify code by allowing intuitive element access, improving readability and integration into existing programming paradigms that expect array-like structures. Indexers support encapsulation by maintaining control over how data in a collection is retrieved or modified, hiding the implementation details from the user . However, potential drawbacks include the risk of over-simplification, where inappropriate use might encroach upon specialized collection behavior or performance, and the added complexity they introduce for maintaining state consistency within more intricate data structures. It is important to ensure that indexers are clearly documented and their behavior consistent to avoid confusion or errors.

Enums in C# represent a value type that consists of named constants, allowing developers to define a set of related values, such as days of the week or application statuses . This helps improve code readability by enabling the use of meaningful names rather than arbitrary numeric values, thus clarifying the code for developers. For instance, instead of using `1` and `2` to represent days, using `Days.Sunday` and `Days.Monday` makes the intent clear . Enums also enhance maintainability by centralizing control of permissible values within a single definition, reducing the risk of errors that arise from magic numbers scattered across the codebase. They reinforce type safety, preventing invalid values, and make the code easier to change or extend, as adding new constants doesn't require altering the underlying logic.

Constructors and finalizers serve different purposes in object lifecycle management within C#. Constructors are special methods used to initialize a class instance with initial values or setup procedures when it is created; they are crucial for preparing an object for use and can be overloaded to offer multiple initialization paths . It is a best practice to keep constructors lightweight and free of logic that could fail or side-effects that could complicate object creation. Finalizers, on the other hand, are methods called when an object is garbage collected, used primarily to release unmanaged resources such as file handles or network connections . Due to the non-deterministic nature of finalization, releasing critical resources should ideally be handled through the `IDisposable` pattern and explicitly using `Dispose()` method calls, reserving finalizers as a safety net for cleanup only.

In C#, a class is a reference type that defines data and behavior and is suitable for representing complex objects like 'Person' or 'Car'. It is allocated on the heap, which allows it to be collected by the garbage collector, making it ideal for scenarios where instances need to be long-lived or shared across the application . In contrast, a struct is a value type used to store small, related data such as 'Point' or 'Color'. Structs are allocated on the stack, which typically makes them more efficient for small data types that are frequently created and destroyed quickly . A struct is preferable in performance-critical applications where small, immutable data types are repeatedly instantiated, as it avoids the overhead of heap allocation. Conversely, a class is preferable when the design requires inheritance, polymorphism, or the instances need to have identity and be shared within the application.

Delegates in C# are type-safe method pointers that hold references to methods with a specific signature, making them ideal for implementing callbacks and events . A delegate can be used to pass methods as arguments to other methods, enabling the execution of code at a later point, as seen in callbacks. This is crucial in scenarios where an operation needs to notify or allow a response from the subscriber without being coupled to specific handler implementations . Events, built on delegates, follow the publisher-subscriber pattern and are central to implementing event-driven programming, where system components communicate through signals or events rather than direct control flows. This mechanism is essential in user interface development and systems requiring loose coupling and high scalability, allowing components to be dynamically added or removed without affecting other parts of the system.

Properties in C# serve to encapsulate access to data fields, providing a level of abstraction between the field and how it is externally accessed or mutated . They allow controlled access, enabling validation and modification of the input provided to a field, which cannot be achieved with public fields directly. Properties support encapsulation by allowing logic to be applied when getting or setting values without altering the external class interface, contributing to the class's robustness and flexibility . This abstraction aligns with object-oriented principles, enhancing maintainability and protection of the internal state, as implementation changes can be accommodated without altering interface contracts. Furthermore, properties can be automated with getter and setter methods, enhancing ease of use and integration within tools and frameworks that rely on them, such as data-binding in UI frameworks.

Deconstructors in C# allow objects to be broken down into constituent parts, facilitating a pattern known as deconstruction, which is commonly used with tuples and records for easy data extraction . This feature is practically applied by enabling more readable code, especially in scenarios where multiple values need to be retrieved from a single object without accessing individual properties directly. A deconstructor method can unpack an object into several out parameters, streamlining these operations in functional and pattern-matching programming styles . Practical applications include simplifying code for complex data structures, enhancing readability, and better integrating with language features like pattern matching, making code both more concise and expressively clearer.

Events in C# enable objects to communicate by sending notifications or signals to subscribers when something occurs, without directly interacting with other objects . This is central to the observer design pattern, where multiple subscribers can respond to state changes or actions without the publisher (object that raises the event) needing to know the specifics of subscriber implementations. Events facilitate loose coupling by allowing disparate components to react to system changes independently, promoting scalability and flexibility in software design . They allow new components to be added or existing ones to be modified without altering the publisher's code. This decoupling reduces interdependencies, allowing for more manageable and testable code that can evolve over time with minimal impact on overall system architecture.

Record types in C# are immutable reference types that offer value-based equality, differing from classes, which are also reference types but typically represent identity through reference equality, and structs, which are immutable value types . The immutability of records ensures that once created, their state cannot be modified, which simplifies thread safety and prevents unintended side-effects. The value-based equality allows records to be compared based on their content rather than their memory reference, making them particularly suitable for representing data models where identity is defined by the values they hold, similar to tuples in functional programming . This feature is particularly advantageous in applications where data integrity and consistency are paramount, or when working with patterns such as Domain-Driven Design (DDD) where objects often represent real-world data entities.

You might also like