Ini adalah pertanyaan tentang metode ekstensi C # dan filosofi desainnya, jadi saya pikir cara terbaik untuk menjawab pertanyaan ini adalah dengan mengutip dokumentasi MSDN tentang tujuan metode ekstensi :
Metode ekstensi memungkinkan Anda untuk "menambahkan" metode ke tipe yang ada tanpa membuat tipe turunan baru, mengkompilasi ulang, atau memodifikasi tipe asli. Metode ekstensi adalah jenis khusus dari metode statis, tetapi mereka dipanggil seolah-olah mereka adalah contoh metode pada tipe extended. Untuk kode klien yang ditulis dalam C #, F # dan Visual Basic, tidak ada perbedaan yang jelas antara memanggil metode ekstensi dan metode yang sebenarnya didefinisikan dalam suatu tipe.
...
Secara umum, kami menyarankan Anda menerapkan metode ekstensi hemat dan hanya ketika Anda harus. Bilamana mungkin, kode klien yang harus memperluas jenis yang ada harus melakukannya dengan membuat jenis baru yang berasal dari jenis yang ada. Untuk informasi lebih lanjut, lihat Warisan.
Saat menggunakan metode ekstensi untuk memperluas tipe yang kode sumbernya tidak dapat Anda ubah, Anda berisiko bahwa perubahan dalam implementasi tipe akan menyebabkan metode ekstensi Anda rusak.
Jika Anda menerapkan metode ekstensi untuk jenis tertentu, ingat poin-poin berikut:
- Metode ekstensi tidak akan pernah dipanggil jika memiliki tanda tangan yang sama dengan metode yang didefinisikan dalam tipe.
- Metode ekstensi dibawa ke ruang lingkup di tingkat namespace. Misalnya, jika Anda memiliki beberapa kelas statis yang berisi metode ekstensi dalam ruang nama tunggal bernama
Extensions
, mereka semua akan dibawa ke ruang lingkup oleh using Extensions;
arahan.
Singkatnya, metode ekstensi dirancang untuk menambahkan metode contoh ke jenis tertentu, bahkan ketika pengembang tidak dapat melakukannya secara langsung. Dan karena metode instance akan selalu menimpa metode ekstensi jika ada (jika dipanggil menggunakan sintaks metode instance), ini hanya boleh dilakukan jika Anda tidak bisa langsung menambahkan metode atau memperluas kelas. *
Dengan kata lain, metode ekstensi harus bertindak seperti metode instance, karena mungkin akhirnya dibuat metode instance oleh beberapa klien. Dan karena metode instance harus melempar jika objek yang dipanggil adalah null
, demikian juga metode ekstensi.
* Sebagai catatan tambahan, ini persis situasi yang dihadapi oleh para perancang LINQ: ketika C # 3.0 dirilis, sudah ada jutaan klien yang menggunakan System.Collections.IEnumerable
dan System.Collections.Generic.IEnumerable<T>
, baik dalam koleksi mereka maupun dalam foreach
loop. Kelas-kelas ini kembali IEnumerator
benda-benda yang hanya memiliki dua metode Current
dan MoveNext
, sehingga menambahkan tambahan apapun metode instan diperlukan, seperti Count
, Any
, dll, akan melanggar jutaan ini klien. Jadi, untuk menyediakan fungsionalitas ini (terutama karena dapat diimplementasikan dalam hal Current
dan MoveNext
dengan relatif mudah), mereka merilisnya sebagai metode ekstensi, yang dapat diterapkan ke semua yang ada saat iniIEnumerable
contoh dan juga dapat diimplementasikan oleh kelas dengan cara yang lebih efisien. Seandainya desainer C # memutuskan untuk merilis LINQ pada hari pertama, itu akan disediakan sebagai metode contoh IEnumerable
, dan mereka mungkin akan merancang semacam sistem untuk menyediakan implementasi antarmuka standar dari metode tersebut.