Bagikan melalui


Perbedaan Antara Templat C++ dan C# Generik (Panduan Pemrograman C#)

Templat C# Generik dan C++ adalah kedua fitur bahasa yang menyediakan dukungan untuk jenis parameter. Namun, ada banyak perbedaan antara keduanya. Pada tingkat sintaks, generik C# adalah pendekatan yang lebih sederhana untuk jenis berparameter tanpa kompleksitas templat C++. Selain itu, C# tidak mencoba menyediakan semua fungsionalitas yang disediakan templat C++. Pada tingkat implementasi, perbedaan utamanya adalah bahwa substitusi jenis generik C# dilakukan saat waktu eksekusi dan informasi jenis generik dipertahankan untuk objek yang sudah diinstansiasi. Untuk informasi selengkapnya, lihat Generik di Runtime.

Berikut ini adalah perbedaan utama antara templat C# Generics dan C++:

  • Generik C# tidak memberikan jumlah fleksibilitas yang sama dengan templat C++. Misalnya, tidak dimungkinkan untuk memanggil operator aritmatika di kelas generik C#, meskipun dimungkinkan untuk memanggil operator yang ditentukan pengguna.

  • C# tidak mengizinkan parameter templat non-jenis, seperti template C<int i> {}.

  • C# tidak mendukung spesialisasi eksplisit; yaitu, implementasi kustom templat untuk jenis tertentu.

  • C# tidak mendukung spesialisasi parsial: implementasi kustom untuk subset argumen jenis.

  • C# tidak mengizinkan parameter jenis digunakan sebagai kelas dasar untuk jenis generik.

  • C# tidak mengizinkan parameter jenis memiliki tipe default.

  • Dalam C#, parameter jenis generik tidak dapat menjadi generik, meskipun jenis yang dibangun dapat digunakan sebagai generik. C++ memungkinkan parameter templat.

  • C++ memungkinkan kode yang mungkin tidak valid untuk semua parameter jenis dalam template, yang kemudian diperiksa berdasarkan jenis spesifik yang digunakan sebagai parameter jenis dalam template. C# mengharuskan kode dalam kelas ditulis sedemikian sehingga akan berfungsi dengan jenis apa pun yang memenuhi batasan. Misalnya, di C++ dimungkinkan untuk menulis fungsi yang menggunakan operator + aritmatika dan - pada objek parameter jenis, yang akan menghasilkan kesalahan pada saat instansiasi templat dengan jenis yang tidak mendukung operator ini. C# melarang ini; satu-satunya konstruksi bahasa yang diizinkan adalah konstruksi yang dapat disimpulkan dari batasan.

Lihat juga