C# - Generics: Pengenalan Menyenangkan untuk Pemula

Halo sana, calon pemrogrammer! Hari ini, kita akan melangsungkan perjalanan menarik ke dunia Generics di C#. Jangan khawatir jika Anda baru dalam pemrogramman – saya akan menjadi panduan ramah Anda, menjelaskan segala sesuatu langkah demi langkah. Jadi, ambil secangkir kopi (atau minuman favorit Anda), dan mari kita masuk ke dalamnya!

C# - Generics

Apa Itu Generics?

Bayangkan Anda sedang mengemas untuk perjalanan, tapi Anda belum yakin apa yang Anda butuhkan. Apakah bukan akan menyenangkan jika Anda memiliki tas ajaib yang dapat menampung apa saja? Itu sebenarnya apa yang generics di C# – mereka adalah seperti wadah fleksibel yang dapat bekerja dengan jenis data yang berbeda.

Generics memungkinkan kita menulis kode yang dapat bekerja dengan jenis data apa pun, tanpa perlu menulis ulang kode yang sama untuk setiap jenis data tertentu. Itu seperti memiliki pisau Swiss Army bukannya lemari penuh dengan alat khusus!

Fitur Generics

Sekarang, mari kita jelajahi beberapa fitur menarik yang membuat generics begitu berguna:

1. Keselamatan Tipe

Generics memastikan bahwa kita menggunakan jenis data yang benar di dalam kode kita. Itu seperti memiliki asisten pintar yang mencegah kita memasukkan ikan ke dalam kandang burung!

2. Reusabilitas Kode

Dengan generics, kita dapat menulis kode sekali dan gunakan dengan banyak jenis data yang berbeda. Itu seperti memiliki resep yang bekerja untuk jenis buah pie apa pun!

3. Performansi

Generics dapat membuat program kita berjalan lebih cepat karena menghindari konversi tipe yang tidak diperlukan. Pensejukkan seperti berbicara langsung dengan seseorang daripada menggunakan penerjemah.

4. Fleksibilitas

Kita dapat menciptakan kelas, metode, dan antarmuka generik yang bekerja dengan jenis apa pun yang kita pilih. Itu seperti memiliki remote universal untuk semua perangkat Anda!

mari kita lihat beberapa contoh kode untuk melihat fitur ini dalam aksi.

Metode Generik

Metode generik seperti seorang koki yang dapat memasak makanan apa pun yang Anda minta. Mari kita buat metode generik sederhana:

public static void PrintItem<T>(T item)
{
Console.WriteLine($"Itemnya adalah: {item}");
}

Dalam contoh ini, <T> adalah pengganti untuk jenis apa pun yang kita ingin gunakan. Kita dapat memanggil metode ini dengan jenis yang berbeda:

PrintItem<int>(42);
PrintItem<string>("Halo, Generics!");
PrintItem<double>(3.14);

Output:

Itemnya adalah: 42
Itemnya adalah: Halo, Generics!
Itemnya adalah: 3.14

Apakah itu menarik? Kita menulis satu metode, tapi ia bekerja dengan integer, string, dan desimal!

Sekarang, mari kita buat contoh yang lebih praktis – metode generik untuk menemukan item terbesar dalam array:

public static T FindLargest<T>(T[] array) where T : IComparable<T>
{
if (array == null || array.Length == 0)
{
throw new ArgumentException("Array tidak boleh null atau kosong");
}

T largest = array[0];
for (int i = 1; i < array.Length; i++)
{
if (array[i].CompareTo(largest) > 0)
{
largest = array[i];
}
}
return largest;
}

mari kitauraikan ini:

  • <T> adalah jenis generik kita.
  • where T : IComparable<T> adalahbatasan yang memastikan T dapat dibandingkan.
  • Kita mulai dengan elemen pertama sebagai yang terbesar dan membandingkan dengan sisanya.

Sekarang kita dapat menggunakan metode ini dengan jenis yang berbeda:

int[] numbers = { 5, 3, 8, 2, 9 };
string[] names = { "Alice", "Bob", "Charlie", "David" };

Console.WriteLine($"Angka terbesar: {FindLargest(numbers)}");
Console.WriteLine($"Nama terakhir secara abjad: {FindLargest(names)}");

Output:

Angka terbesar: 9
Nama terakhir secara abjad: David

Kelas Generik

Kelas generik seperti wadah multifungsi. Mari kita buat kelas stack generik sederhana:

public class GenericStack<T>
{
private List<T> items = new List<T>();

public void Push(T item)
{
items.Add(item);
}

public T Pop()
{
if (items.Count == 0)
{
throw new InvalidOperationException("Stack kosong");
}
T item = items[items.Count - 1];
items.RemoveAt(items.Count - 1);
return item;
}

public bool IsEmpty()
{
return items.Count == 0;
}
}

Sekarang kita dapat menggunakan stack ini dengan jenis apa pun:

GenericStack<int> numberStack = new GenericStack<int>();
numberStack.Push(1);
numberStack.Push(2);
numberStack.Push(3);

while (!numberStack.IsEmpty())
{
Console.WriteLine(numberStack.Pop());
}

GenericStack<string> bookStack = new GenericStack<string>();
bookStack.Push("The Great Gatsby");
bookStack.Push("To Kill a Mockingbird");
bookStack.Push("1984");

while (!bookStack.IsEmpty())
{
Console.WriteLine(bookStack.Pop());
}

Output:

3
2
1
1984
To Kill a Mockingbird
The Great Gatsby

Delegasi Generik

Delegasi generik seperti deskripsi pekerjaan fleksibel. Mereka memungkinkan kita menciptakan metode yang dapat bekerja dengan fungsi jenis yang berbeda. Ini adalah contoh:

public delegate T Operation<T>(T a, T b);

public static T PerformOperation<T>(T a, T b, Operation<T> operation)
{
return operation(a, b);
}

Sekarang kita dapat menggunakan ini dengan operasi yang berbeda:

Operation<int> add = (a, b) => a + b;
Operation<int> multiply = (a, b) => a * b;

Console.WriteLine($"5 + 3 = {PerformOperation(5, 3, add)}");
Console.WriteLine($"5 * 3 = {PerformOperation(5, 3, multiply)}");

Operation<string> concatenate = (a, b) => a + b;
Console.WriteLine($"Hello + World = {PerformOperation("Hello ", "World", concatenate)}");

Output:

5 + 3 = 8
5 * 3 = 15
Hello + World = Hello World

Kesimpulan

Selamat! Anda baru saja mengambil langkah pertama ke dalam dunia menakjubkan C# Generics. Kita telah melihat metode, kelas, dan delegasi generik, melihat bagaimana mereka dapat membuat kode kita lebih fleksibel dan dapat digunakan kembali.

Ingat, belajar menggunakan generics secara efektif seperti memasak – itu memerlukan latihan, tapi sekali Anda menguasaiinya, Anda akan dapat menciptakan hal-hal menakjubkan dengan usaha minimal. Terus mencoba, dan jangan takut membuat kesalahan. Itu adalah bagaimana kita semua belajar dan tumbuh sebagai pemrogrammer.

Selamat coding, dan semoga generics Anda selalu fleksibel dan kode Anda selalu dikompilasi pada percobaan pertama!

Credits: Image by storyset