Pertimbangan versi dan pembaruan untuk pengembang C#
Kompatibilitas adalah tujuan penting karena fitur baru ditambahkan ke bahasa C#. Dalam hampir semua kasus, kode yang ada dapat dikompilasi ulang dengan versi pengompilasi baru tanpa masalah. Tim runtime .NET juga memiliki tujuan untuk memastikan kompatibilitas untuk pustaka yang diperbarui. Dalam hampir semua kasus, saat aplikasi Anda diluncurkan dari runtime yang diperbarui dengan pustaka yang diperbarui, perilakunya sama persis dengan versi sebelumnya.
Versi bahasa yang digunakan untuk mengkompilasi aplikasi Anda biasanya cocok dengan moniker kerangka kerja target runtime (TFM) yang dirujuk dalam proyek Anda. Untuk informasi selengkapnya tentang mengubah versi bahasa default, lihat artikel berjudul mengonfigurasi versi bahasa Anda. Perilaku default ini memastikan kompatibilitas maksimum.
Saat perubahan yang melanggar diperkenalkan, perubahan tersebut diklasifikasikan sebagai:
- Perubahan pemecahan biner: Perubahan pemecahan biner menyebabkan perilaku yang berbeda, termasuk mungkin crash, di aplikasi atau pustaka Anda saat diluncurkan menggunakan runtime baru. Anda harus mengkombinasikan ulang aplikasi untuk menggabungkan perubahan ini. Biner yang ada tidak akan berfungsi dengan benar.
- Perubahan pemecahan sumber: Perubahan pemecahan sumber mengubah arti kode sumber Anda. Anda perlu membuat pengeditan kode sumber sebelum mengkompilasi aplikasi Anda dengan versi bahasa terbaru. Biner Anda yang ada akan berjalan dengan benar dengan host dan runtime yang lebih baru. Perhatikan bahwa untuk sintaks bahasa, perubahan pemecahan sumber juga merupakan perubahan perilaku, seperti yang didefinisikan dalam perubahan pemecahan runtime.
Saat perubahan pemecahan biner memengaruhi aplikasi, Anda harus mengkompilasi ulang aplikasi, tetapi Anda tidak perlu mengedit kode sumber apa pun. Saat perubahan pemecahan sumber memengaruhi aplikasi Anda, biner yang ada masih berjalan dengan benar di lingkungan dengan runtime dan pustaka yang diperbarui. Namun, Anda harus membuat perubahan sumber untuk kompilasi ulang dengan versi bahasa dan runtime bahasa baru. Jika perubahan adalah pemecahan sumber dan pemecahan biner, Anda harus mengkompilasi ulang aplikasi Anda dengan versi terbaru dan membuat pembaruan sumber.
Karena tujuan untuk menghindari perubahan yang melanggar oleh tim bahasa C# dan tim runtime, memperbarui aplikasi Anda biasanya merupakan masalah memperbarui TFM dan membangun kembali aplikasi. Namun, untuk pustaka yang didistribusikan secara publik, Anda harus mengevaluasi kebijakan Anda dengan hati-hati untuk TFM yang didukung dan versi bahasa yang didukung. Anda mungkin membuat pustaka baru dengan fitur di versi terbaru dan perlu memastikan agar aplikasi yang dibuat menggunakan versi pengompilasi sebelumnya dapat menggunakannya. Atau Anda mungkin meningkatkan pustaka yang ada dan banyak pengguna Anda mungkin belum meningkatkan versi.
Memperkenalkan perubahan yang melanggar di pustaka Anda
Saat mengadopsi fitur bahasa baru di API publik pustaka, Anda harus mengevaluasi apakah mengadopsi fitur memperkenalkan perubahan biner atau pemecah sumber untuk pengguna pustaka Anda. Setiap perubahan pada implementasi internal Anda yang tidak muncul di public
antarmuka atau protected
kompatibel.
Catatan
Jika Anda menggunakan System.Runtime.CompilerServices.InternalsVisibleToAttribute untuk mengaktifkan jenis untuk melihat anggota internal, anggota internal dapat memperkenalkan perubahan yang melanggar.
Perubahan pemecahan biner mengharuskan pengguna Anda untuk mengkompilasi ulang kode mereka untuk menggunakan versi baru. Misalnya, pertimbangkan metode publik ini:
public double CalculateSquare(double value) => value * value;
Jika Anda menambahkan pengubah in
ke metode , itu adalah perubahan pemecah biner:
public double CalculateSquare(in double value) => value * value;
Pengguna harus mengkombinasikan ulang aplikasi apa pun yang menggunakan CalculateSquare
metode agar pustaka baru berfungsi dengan benar.
Perubahan pemecahan sumber mengharuskan pengguna Anda mengubah kode mereka sebelum mereka mengkompilasi ulang. Misalnya, pertimbangkan jenis ini:
public class Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string firstName, string lastName) => (FirstName, LastName) = (firstName, lastName);
// other details omitted
}
Dalam versi yang lebih baru, Anda ingin memanfaatkan anggota yang disintesis yang dihasilkan untuk record
jenis. Anda membuat perubahan berikut:
public record class Person(string FirstName, string LastName);
Perubahan sebelumnya memerlukan perubahan untuk jenis apa pun yang berasal dari Person
. Semua deklarasi tersebut harus menambahkan pengubah record
ke deklarasi mereka.
Dampak perubahan yang melanggar
Saat Anda menambahkan perubahan pemecahan biner ke pustaka, Anda memaksa semua proyek yang menggunakan pustaka Anda untuk mengkompilasi ulang. Namun, tidak ada kode sumber dalam proyek tersebut yang perlu diubah. Akibatnya, dampak perubahan yang melanggar cukup kecil untuk setiap proyek.
Saat Anda membuat perubahan pemisah sumber ke pustaka, Anda mengharuskan semua proyek membuat perubahan sumber untuk menggunakan pustaka baru Anda. Jika perubahan yang diperlukan memerlukan fitur bahasa baru, Anda memaksa proyek tersebut untuk meningkatkan ke versi bahasa yang sama dan TFM yang sekarang Anda gunakan. Anda telah memerlukan lebih banyak pekerjaan untuk pengguna Anda, dan mungkin memaksa mereka untuk meningkatkan juga.
Dampak perubahan yang melanggar yang Anda buat tergantung pada jumlah proyek yang memiliki dependensi pada pustaka Anda. Jika pustaka Anda digunakan secara internal oleh beberapa aplikasi, Anda dapat bereaksi terhadap perubahan yang melanggar di semua proyek yang terkena dampak. Namun, jika pustaka Anda diunduh secara publik, Anda harus mengevaluasi dampak potensial dan mempertimbangkan alternatif:
- Anda dapat menambahkan API baru yang paralel dengan API yang ada.
- Anda mungkin mempertimbangkan build paralel untuk TFM yang berbeda.
- Anda mungkin mempertimbangkan multi-penargetan.