Di tingkat 2, saya mulai berdamai
dengan kesulitan memrogram, dan .NET pun merasuk dalam kehidupan
pemrograman, memberikan banyak kemudahan dan kelas-kelas dasar untuk
digunakan. Ya,itulah framework, sekumpulan library yang membentuk
kerangka program yang mau kita tulis. Zaman sekarang, jika ingin
membuat aplikasi, sebaiknya dimulai dengan eksplorasi tersedia atau
tidaknya framework yang mendukung pembuatan aplikasi tersebut. Tidak
terbatas hanya .NET, berlaku untuk semua bahasa. Jika sudah terdapat
framework, tentu pekerjaan kita terbantu seperti pepatah yg banyak
bilang “Don’t reinvent the wheel …” .
Nah, C# sejak setahun terakhir memang
menjadi pilihan utama saya dalam pengerjaan tugas ataupun proyek yang
kebetulan mampir. C# sangat apik, menyembunyikan keseluruhan manajemen
memori dengan hadirnya garbage collector dan reference. Akan
tetapi,untuk membuat suatu bahasa cukup powerful terkadang pada
sebagian kasus kita butuh untuk mengakses memori secara langsung,
itulah yang dimaksud dengan unsafe code- Kode yang tidak aman.
Unsafe Code
Pada dasarnya, sebagaian besar pemrograman pada .NET tidak membutuhkan unsafe code, kecuali untuk hal-hal sebagai berikut :
- Aplikasi real-time, untuk meningkatkan performa aplikasi
- Fungsi eksternal, dalam non-.net DLL beberapa fungsi memerlukan pointer sebagai parameter, seperti WinAPI yang ditulis dalam C
- Debugging, terkadang dibutuhkan inspeksi terhadap isi memori pada saat debugging.
Di situs ini (http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx)
ditambahkan bahwa penggunaan unsafe code terutama untuk masalah yang
berkenaan dengan pengaksesan struktur pada storage, dan advance COM.
Peringatannya adalah, kode yang tidak aman ini tidak dapat dijalankan
pada lingkungan yang tidak terpercaya (untrusted environment), misalnya
internet.
Berikut keuntungan dan kekurangan unsafe code yang saya terjemahkan dari (http://www.codersource.net/csharp_unsafe_code.html)
Keuntungan Unsafe Code
- Performansi dan fleksibiltas, pengaksesan data dan manipulasinya dapat dikerjakan dengan lebih efisien
- Kompatibilitas, terutama dengan native winApi.
- Pengalamatan memori, tidak mungkin mengetahui alamat memori suatu data tanpa menggunakan pointer
Kekurangannya
- Sintaks yang cukup kompleks
- Sulit digunakan, dan mesti hati-hati karena bisa mengakibatkan
overwriting, stack oveflow, access memory yang kosong dan overwrite
informasi yang dbuuthkan .net runtime.
- Kode lebih susah di debub, kesalahan kecil pada penggunaan pointer,
membuat aplikasi bisa crash secara random, tidak terprediksi dan sulit
diproduksi lagi kesalahannya
- Pengaturan boleh tidaknya unsafe code di jalankan pada mesin yang berbeda
Salah satu penggunaan yang memerlukan unsafe code ketimbang managed code adalah pada field image processing.
Sebelum ini, saya sedang mengerjakan tugas yang berkaitan dengan
pengaksesan pixel demi pixel menggunakan kelas Bitmap yang disediakan
.NET. Memang tergolong cukup mudah, telah tersedia method setPixel dan
getPixel, kita hanya perlu menggunakannya. Akan tetapi, untuk kasus
ukuran file yang begitu besar, terkadang failed dan waktu eksekusinya
cukup lama. Lalu pada beberapa forum ada yang menyarankan penggunaan
unsafe code, dimana Bitmap di lock di dalam memori, dan kita mengakses
pixel per pixel ke alamat nya langsung di memori. Alhasil, ternyata
memang benar, algoritmanya berjalan lebih cepat dan hingga saat ini
masih selalu berhasil untuk ukuran file yang besar.
Penggunaan unsafe code ada beberapa cara, misalnya mendeklarasi kan keseluruhan kelas sebagai unsafe
Unsafe class ClassX
{
//Use pointer here
}
Atau pada bagian properti saja misalnya
class ClassX
{
Unsafe int* ptr;
Unsafe void MyMethod()
{
//use pointer here
}
}
Untuk penggunaan unsafe local variabel pada method dapat menggunakan block unsafe seperti
static void Main()
{
//can’t use pointers here
unsafe
{
//you can declare and use pointer here
}
//can’t use pointers here
}
Kemudian hal yang saya temukan lagi
adalah perbedaan representasi nilai RGB pada Windows. Secara berurutan
windows menyimpan RGB menjadi BGR untuk satu pixel data di memori. Hal
ini saya sadari ketika menggambar histogram citra yang mengakibatkan
terbaliknya nilai R dan B akibat representasi yang sebelumnya tidak
saya ketahui ini.