День сто двадцать шестой. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по C#

13. В чем разница между поздним и ранним связыванием в C#?

Концепции раннего связывания и позднего связывания относятся к полиморфизму в C#. Полиморфизм - это особенность объектно-ориентированного программирования, позволяющая языку использовать одно и то же имя метода в разных формах.

Есть 2 способа достижения этого:

1. Во время компиляции – статический полиморфизм, раннее связывание или перегрузка (overloading).

2. Во время выполнения – динамический полиморфизм, позднее связывание или переопределение (overriding).



Полиморфизм времени компиляции или раннее связывание

При перегрузке методы имеют одно и то же имя, но разные сигнатуры. Это также известно, как полиморфизм времени компиляции, поскольку решение о том, какой метод вызывать, принимается во время компиляции. Компилятор C# проверяет количество передаваемых параметров и типы параметров и принимает решение, какой метод вызывать, либо выдаёт ошибку времени компиляции, если подходящий метод не найден:

public class TestData

{

public int Add(int a, int b, int c)

{

return a + b + c;

}

public int Add(int a, int b)

{

return a + b;

}

}



TestData data = new TestData();

int sum1 = dataClass.Add(45, 34, 67);

int sum2 = dataClass.Add(23, 34);



Полиморфизм времени выполнения или позднее связывание

Здесь имена и сигнатуры методов (количество параметров и типы параметров) должны быть одинаковыми, однако методы могут иметь различную реализацию. Переопределение метода может быть выполнено с использованием наследования. Компилятор решает, какой метод вызывать, во время выполнения. Если доступен переопределённый метод, будет вызван он, в противном случае будет вызван метод базового класса. В следующем примере классы A и B переопределяют метод ToString базового класса object. Поэтому при выводе их в консоль будут использованы переопределённые версии, а при выводе класса C будет использован метод ToString базового класса object:

public class A

{

public override string ToString() => "Class A";

}

public class B

{

public override string ToString() => "Class B";

}

public class C {}



var objects = new object[] { new A(), new B(), new C() };

foreach (var obj in objects)

{

Console.WriteLine(obj);

}

Вывод:

Class A

Class B

ConsoleApp1.C



Источник: https://www.c-sharpcorner.com