Влияние изменений кода на совместимость
Совместимость — это возможность компилировать или выполнять код в версии реализации .NET, отличной от той, в которой код был изначально разработан. Конкретное изменение может повлиять на совместимость шестью различными способами:
- изменение поведения;
- совместимость на уровне двоичного кода;
- совместимость исходного кода;
- совместимость во время разработки;
- обратная совместимость;
- прямая совместимость (не является целью в .NET Core).
изменение поведения;
Изменение поведения представляет собой изменение в поведении элемента. Изменение может быть видимым извне (например, метод может вызывать другое исключение) или может представлять измененную реализацию (например, изменение способа вычисления возвращаемого значения, добавление или удаление внутренних вызовов метода или даже значительное повышение производительности).
Если изменения поведения видимы извне и изменяют открытый контракт типа, их легко оценить, так как они влияют на совместимость на уровне двоичного кода. Изменения в реализации оценить гораздо труднее. В зависимости от характера изменения и частоты и схемы использования интерфейса API влияние изменения может варьироваться от серьезного до малозначительного.
совместимость на уровне двоичного кода;
Под совместимостью на уровне двоичного кода понимается возможность потребителя API использовать его в более новой версии без перекомпиляции. Такие изменения, как добавление методов или добавление новой реализации интерфейса в тип, не влияют на совместимость двоичных файлов. Однако удаление открытых сигнатур сборки или их изменение таким образом, что потребители больше не имеют доступа к интерфейсу, предоставляемому сборкой, влияют на совместимость на уровне двоичного кода. Изменение такого рода называется изменением, несовместимым на уровне двоичного кода.
совместимость исходного кода;
Под совместимостью исходного кода понимается возможность перекомпиляции существующих потребителей API без изменения исходного кода. Изменение, несовместимое на уровне исходного кода, имеет место, когда потребителю необходимо изменить исходный код для его успешной сборки в более новой версии API.
совместимость во время разработки;
Под совместимостью во время разработки понимается сохранение возможностей разработки в разных версиях Visual Studio и других средах разработки. Это может касаться поведения или пользовательского интерфейса конструкторов, однако самый важный аспект совместимости во время разработки — совместимость проекта. Необходимо, чтобы проект или решение можно было открывать и использовать в более новой версии среды разработки.
обратная совместимость;
Под обратной совместимостью понимается возможность выполнения существующего потребителя API в новой версии без изменения поведения. На обратную совместимость влияют как изменения поведения, так и изменения в совместимости на уровне двоичного кода. Если потребитель не может работать с более новой версией API или ведет себя иначе при ее использовании, этот API не обладает обратной совместимостью.
Применять изменения, влияющие на обратную совместимость, не рекомендуется, так как разработчик предполагают наличие обратной совместимости в более новых версиях API.
Прямая совместимость
Под прямой совместимостью понимается возможность выполнения существующего потребителя API в предыдущей версии без изменения поведения. Если потребитель не может работать с более старой версией API или ведет себя иначе при ее использовании, этот API не обладает прямой совместимостью.
Обеспечение прямой совместимости практически исключает любые изменения или дополнения в новых версиях, так как такие изменения препятствуют работе потребителя, предназначенного для более поздней версии, с более ранней версией. Разработчики ожидают, что потребитель, использующий более новую версию API, может работать неправильно с более старой версией.
Поддержка прямой совместимости не является целью в .NET Core.