C# Tutorial

C# Tutorial C# First Application C# Variables C# Data Types C# Operators C# Keywords

C# Control Statement

C# If Statements C# Switch Statements C# for Loop C# While Loop C# do While loop C# Jump Statements C# Function C# functions with out variable

C# Arrays

C# Arrays

C# Function

C# Function call by value C# Call by reference C# Passing array to function C# Multidimensional Arrays C# Jagged Arrays C# Params C# Array Class C# Command Line Arguments

C# Object Class

C# Object and Classes C# Constructors C# Destructor C# this Keyword C# static field C# static class C# Static Constructor C# Structs C# enum C# Properties

C# Inheritance

C# Inheritance C# Multilevel Inheritance C# Aggregation C# Member overloading C# Method Overriding C# Base

C# Polymorphism

C# Polymorphism C# Sealed

C# Abstraction

C# Abstraction C# Interface

C# Namespace

C# Namespace C# Access Modifiers C# Encapsulation

C# Strings

C# String

C# Misc

C# Design Patterns Dictionary in C# Boxing and Unboxing in C# Ref and Out in C# Serialization in C# Dispose and Finalize in C# CONSOLE LOG IN C# Get File extension in C# Insert query in c# Difference Between List and Dictionary in C# Getters and Setters in C# Extension Methods in C# Insert query in c# CONSOLE LOG IN C# Get File extension in C# Random.NextDouble() Method in C# Binary Search in C# Difference between Delegates and Interfaces in C# Double.IsFinite() Method in C# Index Constructor in C# Abstraction in C# Basic OOPS Concepts In C# Queue.CopyTo() Method in C# single.compareto() method in C# C# Throw Exception in Constructor DECODE IN C# file.setlastwritetimeutc() method in C# Convert Object to List in C# convert.ToSByte(string, IFormatProvider) Method in C# C# Declare Delegate in Interface console.TreatControl C As Input property in C# Copying the queue elements to 1-D Array in C# Array.Constrainedcopy() Method in C# C# in and out Char.IsLetterOrDigit() method in C# Debugging in C# decimal.compare() method in C# Difference between Console.Read and Console.Readline in C# Metadata in C# C# Event Handler Example Default Interface Methods in C# Difference between hashtable and dictionary in C# C# program to implement IDisposable Interface Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File C# Error Logging C# ENCRIPTION Can we create an object for Abstract Class in C# Console.CursorVisible in C# SortedDictionary Implementation in C# C# Hash Table with Examples Setting the Location of the Label in c# Collections in c# Virtual Keyword in C# Reverse of string in C# String and StringBuilder in C# Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File Difference between ref and out in C# Singleton Class in C# Const And Readonly In Csharp BinaryReader and BinaryWriter in C# C# Attributes C# Delegates DirectoryInfo Class in C# Export and Import Excel Data in C# File Class in C# FileInfo Class in C# How to Cancel Parallel Operations in C#? Maximum Degree of Parallelism in C# Parallel Foreach Loop in C# Parallel Invoke in C# StreamReader and StreamWriter in C# TextReader and TextWriter in C# AsQueryable() in C# Basic Database Operations Using C# C# Anonymous Methods C# Events C# Generics C# Indexers C# Multidimensional Indexers C# Multithreading C# New Features C# Overloading of Indexers Difference between delegates and events in C# Operator overloading in C# Filter table in C# C# Queue with Examples C# Sortedlist With Examples C# Stack with Examples C# Unsafe Code File Handling in C# HashSet in C# with Examples List Implementation in C# SortedSet in C# with Examples C# in Depth Delegates and Events in C# Finally Block in C# How to Split String in C# Loggers in C# Nullable Types in C# REVERSE A STRING IN C# TYPE CASTING IN C# What is Generics in C# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# Atomic Methods Thread Safety and Race Conditions in C# Parallel LINQ in C# Design Principles in C# Difference Between Struct And Class In C# Difference between Abstraction and Encapsulation in C# Escape Sequence Characters in C# What is IOC in C# Multiple Catch blocks in C# Appdomain in C# Call back methods in C# Change Datetime format in C# Declare String array in C# Default Access Specifier in c# Foreach in LINQ C# How to compare two lists in C# How to Convert String to Datetime in c# How to get only Date from DateTime in C# Ispostback in asp net C# JSON OBJECT IN C# JSON STRINGIFY IN C# LAMBDA FUNCTION IN C# LINQ Lambda Expression in C# Microservices in C# MSIL IN C# Reference parameter in C# Shadowing(Method hiding) in C# Solid principles in C# Static Members in C# Task run in C# Transaction scope in C# Type Conversion in c# Unit of Work in C# Unit Test Cases in c# User Defined Exception in c# Using Keyword in C# Var Keyword in C# What is gac in C#

Default Interface Methods in C#

Interfaces were limited to declaring their members (methods, properties, events, and indexers) before C# 8.0, but as of that version, interfaces can include both members and their implementation. Default interface methods, also referred to as virtual extension methods, are the types of methods that can be added to an interface without negatively impacting its current implementation. The traits programming technique is made possible for programmers by this feature, which is an object-oriented programming technique that permits the reuse of methods across unrelated classes.

Important features:

There are several important features of the Default Interface Methods in C#. Some of them are as follows:

  • Implementing an indexer, property, or event accessor in the interface is permitted.
  • Access modifiers such as override, sealed, external, virtual, abstract, protected, private, and static are permitted to be used in the interface along with default methods and properties. Exercise caution when utilizing modifier keywords.
  • In the interface, we can create static fields, methods, properties, indexers, and events.
  • Modifiers are overridable.
  • The public has default access to the explicit access modifiers.
  • If the interface has default methods and is inherited by a designated class, the class in question is unaware of their existence and lacks the implementation of said methods.
  • Parameters are permitted when using the default method. There is no need to use a modifier if we override the default procedure.
  • Although they must have distinct parameter lists, methods with the same names can be used in the interface.
  • We can expand the standard method.

Example:

Let us take an example to illustrate the Default Interface Methods in C#.

using System;

// Define an interface with a default method

public interface IMyInterface

{

    // Regular method signature

    void RegularMethod();

    // Default method with an implementation

    // This method can be overridden by implementing classes

    // or inherited as-is

    public void DefaultMethod()

    {

        Console.WriteLine("Default implementation of DefaultMethod in IMyInterface");

    }

}

// A class implementing the interface

public class MyClass : IMyInterface

{

    public void RegularMethod()

    {

        Console.WriteLine("Regular method implementation in MyClass");

    }

    // Overriding the default method if needed

    public void DefaultMethod()

    {

        Console.WriteLine("Custom implementation of DefaultMethod in MyClass");

    }

}

class Program

{

    static void Main(string[] args)

    {

        // Create an instance of MyClass

        MyClass myObj = new MyClass();

        // Call methods

        myObj.RegularMethod();   // Output: Regular method implementation in MyClass

        myObj.DefaultMethod();   // Output: Custom implementation of DefaultMethod in MyClass

        // Interface reference

        IMyInterface myInterfaceObj = myObj;

        // Call default method through interface reference

        myInterfaceObj.DefaultMethod();   // Output: Custom implementation of DefaultMethod in MyClass

    }

}

Output:

Regular method implementation in MyClass

Custom implementation of DefaultMethod in MyClass

Custom implementation of DefaultMethod in MyClass

Explanation:

In this example, a regular method called RegularMethod() and a default method called DefaultMethod() are both declared by IMyInterface. Implementing IMyInterface, the MyClass class overrides DefaultMethod() with its own implementation and offers its own implementation for RegularMethod(). The flexibility of default interface methods is finally demonstrated in the Main method, where we call both regular and default methods using an instance of MyClass and an interface reference.

Example 2:

Let us take another example to illustrate the Default Interface Methods in C#.

using System;

// A simple interface

interface ICustomInterface {

          void Show();

          // Default method with both

          // declaration and definition

          // Here, the name of both methods are same

          // but the parameter list is different

          public void Show(int x, int y)

          {

                    int product;

                    product = x * y;

                    Console.WriteLine("Product: " + product);

          }

}

// A class which

// implements ICustomInterface interface

class ExampleClass : ICustomInterface {

          // Providing the body

          // part of the method

          public void Show()

          {

                    Console.WriteLine("Greetings! Method of ICustomInterface");

          }

          // Main Method

          public static void Main(String[] args)

          {

                    // Creating an object

                    ExampleClass example = new ExampleClass();

                    // Calling method

                    example.Show();

                    // Creating an object

                    ICustomInterface obj = example;

                    // Calling and passing parameters in the default method

                    obj.Show(3, 5);

          }

}

Output:

Greetings! Method of ICustomInterface

Product: 15

Conclusion:

In conclusion, the default interface methods added to C# in version 8.0 constitute a major improvement over the language's interface capabilities. This feature enables the provision of default behaviour for methods within interfaces by allowing method implementations to be included alongside method declarations. Default interface methods encourage code reuse and maintainability by providing a mechanism to change interfaces over time without interfering with already implemented implementations. In order to maintain backward compatibility and provide flexibility, implementing classes can choose to override default method implementations with custom behavior or inherit them. C# facilitates the design of more expressive and cohesive APIs by allowing interfaces to contain both abstract and default methods. This feature helps developers create software systems that are both reliable and scalable.