Mari Belajar Pemrograman Berorientasi Objek menggunakan Visual C# 6.0 Published by Risal at Smashwords Copyright 2015 Risal ISBN 9781310328343
License Notes Thank you for downloading this ebook. You are welcome to share it with your friends. This book may be reproduced, copied and distributed for non-commercial purposes, provided the book remains in its complete original form.Thank you for your support. This book is only availabe in Indonesian.
Nota Lisensi Terimakasih telah mengunduh ebook ini. Anda diperkenankan untuk membagikannya kepada teman-teman Anda. Buku ini boleh diproduksi ulang, disalin, dan disebarluaskan untuk keperluan non-komersial, selama buku tetap pada kondisi lengkap sama seperti aslinya. Terimakasih untuk dukungan Anda. Buku ini hanya tersedia dalam bahasa Indonesia.
Kata Pengantar Terimakasih kepada Tuhan YME atas rampungnya buku yang berjudul "Mari Belajar Pemrograman Berorientasi Objek menggunakan Visual C# 6.0". Terimakasih juga kepada istri (Lea), anak saya (Raphael), sanak keluarga, dan rekan-rekan yang selalu mendukung saya. Buku ini akan menuntun pembaca untuk mengenal konsep umum pemrograman beorientasi objek dan bahasa pemrograman C#. Hampir sebagian besar kode program ditulis menggunakan Visual Studio 2015, yang saat buku ini ditulis masih versi CTP 5. Fitur terbaru pada bahasa pemrograman C# juga dibahas pada buku ini dan akan diperbaharui seiring berjalannya waktu. Buku ini juga disertai dengan banyak contoh kode program yang dapat diikuti dan latihan mandiri, sehingga diharapkan dapat memudahkan pembaca untuk mengikuti pembahasan pada buku ini. Akhir kata, selamat membaca, selamat belajar, dan selamat mencoba. Semoga buku ini dapat membantu rekan-rekan pengembang untuk belajar pemrograman berorientasi objek menggunakan bahasa pemrograman C#. Kritik dan saran dapat ditujukan langsung via email.
Bandung, Januari 2015
Risal
Daftar Isi Pemrograman Berorientasi Objek Abstraction Encapsulation Inheritance Polymorphism Class/Object/Type Unified Modeling Language Use Case Activity Diagram Class Diagram Hello C# Kelas Console Tipe Data dan Variabel Boolean Bilangan Integer Bilangan Riil Uang Tanggal dan Waktu Karakter dan String Array Boxing/Unboxing Casting Parsing Mengatur Alir Kode Program Analisa Kasus Kata Kunci if-else Kata Kunci switch-case Operator Kondisi Pengulangan Kata Kunci for Kata Kunci foreach Kata Kunci do-while Penanganan Eksepsi Membuat Sebuah Kelas Namespace Peubah Akses Field Konstanta Readonly Method Property Constructor Overloading
Operator Overloading Static Struct Class vs Struct Enum Abstract dan Interface Inheritance Override Hiding, Overloading, dan Overriding Sealed Abstract Class Interface Class Library Struktur Data Generik List
Stack Queue Dictionary Languange Integrated Query (LINQ) Kueri Umum Filter Data Sorting Data Proyeksi Data Menggabungkan Data
Pemrograman Berorientasi Objek Pemrograman berorientasi objek adalah paradigma pemrograman yang membagi pekerjaan menjadi kumpulan objek yang saling bekerja dan berinteraksi satu dengan yang lain untuk menyelesaikan masalah. Objek adalah sebuah struktur data yang terdiri dari kumpulan atribut dan kumpulan operasi. Pada bahasa pemrograman atribut adalah field sedangkan operasi adalah method. Objek pada pemrograman berorientasi objek merupakan instans dari kelas (class). Dengan kata lain sebelum ada objek maka harus dibuat kelas terlebih dahulu (kelas adalah template/pola dari objek). Bahasa pemrograman berorientasi objek biasanya mengadopsi multi paradigma (lebih dari satu paradigma pemrograman). Bahasa pemrograman C# tidak terkecuali. Bahasa pemrograman C# adalah bahasa pemrograman modern dibuat oleh Microsoft sebagai salah satu bahasa yang dirancang untuk menggunakan framework .NET. Bahasa pemrograman C# diajukan dan disetujui oleh dua badan standar internasional Ecma (ECMA-334) dan ISO (ISO/IEC 23270:2006). Bahasa ini dirancang sebagai bahasa yang dapat digunakan untuk menyelesaikan berbagai macam masalah, sederhana, dan modern. Paradigma pemrograman berorientasi objek memiliki empat pilar pendukung. Empat pilar tersebut adalah abstraksi (abstraction), enkapsulasi (encapsulation), polimorfisme (polymorphism), dan pewarisan (inheritance).
Abstraction Abstraksi (abstraction) adalah salah satu metode dalam pemrograman berorientasi objek untuk menyajikan fitur yang penting dan menyembunyikan detail yang tidak berkaitan. Tujuan abstraksi adalah mengurangi kompleksitas dan meningkatkan efisiensi. Sebuah objek dapat memiliki banyak abstraksi. Contoh objek mobil bilamana digunakan untuk simulasi maka atribut tenaga kuda, torsi, dan banyak percepatan merupakan hal yang penting. Sedangkan atribut warna, jumlah kursi, harga bukan hal yang penting. Lain halnya jika objek mobil digunakan untuk sistem penjualan mobil maka atribut warna dan harga merupakan hal yang penting.
Encapsulation Enkapsulasi (encapsulation) adalah proses menempatkan atribut (data) dari entitas dan operasi (fungsi/prosedur/method) yang dapat dilakukan entitas dalam sebuah wadah (class). Dengan demikian class dapat digunakan tanpa harus mengetahui cara kerja class itu sendiri.Enkapsulasi melindungi data sehingga tidak dapat diakses langsung oleh class lain. Data dapat diubah melalui operasi yang dibagikan oleh class bersangkutan. Contoh atribut volume suara, atribut nomor stasiun, operasi ganti saluran, dan operasi ubah volume suara dienkapsulasi dalam kelas televisi. Sedemikian rupa
sehingga ketika pengguna mengubah volume suara, pengguna tidak perlu tahu proses yang dilakukan oleh operasi ubah volume suara untuk mengubah nilai atribut volume suara.
Inheritance Pewarisan (inheritance) adalah proses pembuatan kelas baru dari kelas yang sudah ada sebelumnya. Kelas yang baru dapat memiliki tambahan atribut dan operasi. Inheritance adalah salah satu cara penggunaan kode berulang yang ditawarkan oleh paradigma pemrograman berorientasi objek. Selain inheritance penggunaan kode berulang dapat juga menggunakan cara komposisi, dimana cara ini jauh lebih disarankan dibandingkan inheritance. Pewarisan sebaiknya digunakan pada kelas yang memang memiliki relasi ayahanak atau umum-spesifik. Contoh penggunaan inheritance yang tepat adalah ketika membuat kelas Mobil dari kelas Kendaraan (Mobil mewarisi sifat/property dari Kendaraan). Kendaraan adalah kelas yang umum, sedangkan Mobil adalah kelas yang lebih spesifik.
Polymorphism Polimorfisme (polymorphism) berasal dari bahasa yunani, poly yang berarti banyak dan morph yang berarti bentuk. Jadi dapat dikatakan bahwa polimorfisme adalah banyak bentuk. Dalam pemrograman berorientasi objek polimorfisme adalah penggunakan satu buah antarmuka (interface) untuk berbagai tipe. Dikenal tiga jenis polimorfisme. • Ketika sebuah method memiliki lebih dari satu variasi, dikenal juga dengan nama method overloading (method overloading akan dibahas pada bab mendatang). • Ketika sebuah/sekumpulan kode program dibuat tanpa merujuk ke tipe atau kelas tertentu. Pada bahasa pemrograman C# hal ini dapat dilakukan dengan menggunakan generic. • Ketika sebuah method dari sebuah kelas dipanggil menggunakan referensi dari kelas induk. Hal ini dimungkinkan bilamana kelas memiliki satu kelas induk yang sama (subtyping).
Class/Object/Type Kelas (class) adalah kode program yang digunakan sebagai pola (template) dalam membuat sebuah objek. Kelas berisi definisi dari tiap atribut dan operasi. Selain itu kelas juga biasanya akan melakukan inisialisasi awal dari tiap atribut, sehingga nanti ketika dibuat instansnya (objek) siap digunakan.Pada beberapa buku, kelas juga sering dirujuk sebagai tipe (type). Pada implementasinya di bahasa pemrograman, tipe adalah sebuah kelas.
Pada bahasa pemrograman C#, kelas memiliki field (atribut), method (operasi), property (aksesor/mutator). Field dapat dianalogikan sebagai variabel global yang dikenali dalam kelas. Method adalah nama lain dari sebuah prosedur/fungsi. Sedangkan property adalah method khusus yang digunakan untuk mengembalikan/ menyimpan nilai dari field. Method khusus ini dikenal dengan nama aksesor (mengembalikan nilai field) dan mutator (mengubah/menyimpan nilai ke dalam field).
Unified Modeling Language Unified Modeling Language (UML) adalah bahasa yang dirancang sebagai standar untuk visualisasi sistem perangkat lunak. UML merupakan karya dari Grady Booch, Ivar Jacobson, dan James Rumbaugh. Pada tahun 1997 UML diadopsi sebagai standar oleh Object Management Group (OMG), lalu diajukan ke lembaga standarisasi internasional (ISO) pada tahun 2000. UML menawarkan berbagai macam diagram untuk memodelkan sistem. UML membagi diagram menjadi dua kategori, yaitu (1) structural dan (2) behavioral. Structural diagram menggambarkan struktur dari sistem sedangkan behavioral diagram menggambarkan interaksi yang terkadi di dalam sistem. Class diagram, component diagram, composite structure diagram, deployment diagram, object diagram, package diagram, dan profile diagram termasuk dalam kategori structural diagram. Activity diagram, communication diagram, interaction overview diagram, sequence diagram, state diagram, timing diagram, dan use case diagram termasuk dalam kategori behavioral diagram. Pada sub-bab berikut dibahas beberapa diagram yang sering digunakan ketika mendesain sebuah sistem. Diagram yang dibahas adalah use case diagram, activity diagram, dan class diagram.
Use Case Use case diagram digunakan untuk menggambarkan bentuk sederhana interaksi aktor ke sistem. Aktor dalam konteks use case dapat berupa pengguna atau dapat berupa sistem lainnya. Tiap aktor dalam use case biasanya memiliki peran dan aksesibilitas yang berbeda. Komponen penyusun use case diagram hanya dua, (1) aktor - digambarkan sebagai stick figure dan (2) use case - digambarkan dengan elips. Contoh: Use case diagram berikut digunakan untuk menggambarkan forum. Asumsi sebuah forum dapat memiliki berbagai macam jenis pengguna dengan peran berbeda. Pengunjung hanya dapat lihat posting yang dilakukan pengguna. Pengguna biasa dapat membuat posting dan reply posting lama. Admin dapat blokir posting dan menghapus posting pengguna lainnya.
View Post
Visitor Create New Post
Users
Member
Reply Post
Block Post
Admin Delete Post
Activity Diagram Activity diagram (diagram aktifitas) digunakan untuk memodelkan komputasi atau alur kerja yang terjadi dalam sistem. Komponen penyusun diagram aktifitas ada lima, yaitu: • Persegi panjang bulat (kapsul) digunakan untuk menggambarkan aktifitas. • Belah ketupat untuk menggambarkan keputusan (analisa kasus). • Persegi hitam (bar) digunakan untuk menggambarkan proses yang dilakukan pararel. Proses pararel diawali dan diakhiri dengan persegi hitam ini. • Lingkaran hitam menggabarkan awal dari alir kerja. • Lingkaran hitam yang dilingkari menggambarkan akhir dari alir kerja. Contoh: Diagram aktifitas berikut menggambarkan aktifitas login yang dilakukan pengguna. Proses login dapat dituliskan sebagai berikut: • Pengguna akan memasukan informasi nama pengguna dan kata kunci. • Samakan informasi yang dimasukan oleh pengguna. • Bilamana benar maka pindahkan pengguna ke laman/window yang sesuai. • Bilamana salah tampilkan pesan kesalahan dan minta pengguna untuk memasukan ulang.
Receive "UserName"
Receive "Password"
Authenticate User
Get values from storage and compare it with users input
Display Error Message
Login Failed: Wrong "UserName" or "Password"
Redirect to User Specific Window
Login Success
Class Diagram Class diagram (diagram kelas) menggambarkan struktur dari sistem itu sendiri. Diagram kelas menampilkan anggota kelas (atribut dan operasi) dan relasi antar kelas. Komponen penyusun diagram kelas hanya dua, yaitu: • Persegi dengan tiga wadah digunakan untuk menggambarkan kelas. Wadah pertama (atas) digunakan untuk menuliskan nama kelas. Wadah kedua (tengah) berisi kumpulan atribut yang ada dalam kelas. Wadah ketiga (bawah) berisi kumpulan operasi. Atribut/operasi biasanya diawali oleh simbol +, -, atau # yang menunjukan aksesibilitas atribut/operasi tersebut. Tanda + melambangkan public, bisa diakses oleh entitas di luar kelas dan di dalam kelas. Tanda - melambangkan private, hanya bisa di akses oleh entitas dalam kelas. Tanda # melambangkan protected, bisa diakses oleh entitas kelas itu sendiri dan turunannya. • Garis dengan berbagai macam anak panah, digunakan untuk menggambarkan relasi antara kelas satu dengan kelas lainnya. Tiap jenis anak panah menggambarkan jenis relasi yang berbeda.
Anim al
AnimalGenerator
Attributes
Attributes
- age : int - weight : int
Operations + CreateAnimal(string kind) : Animal
Operations + + + +
Bird
GetAge() : int GetWeight() : int SetAge(age : int) SetWeight(weight : int)
Frog
Attributes
Attributes
Operations
Operations
+ Fly()
+ Swim()
Evaluasi 1. Apakah keuntungan metodologi pemrograman berorientasi objek dibandingkan dengan metodologi lainnya? 2. Selain diagram use case, diagram aktifitas, dan diagram kelas, sebutkan dan jelaskan kegunaan diagram UML lainnya.
Hello C# Kode program pertama yang akan dibuat adalah aplikasi "Hello World". Cuplikan kode program berikut adalah kode program tersebut. us i ng Sys t em; namespace Hel l oWor l d { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t eLi ne( "Hel l o Wor l d") ;
}
}
}
// Hasi l : // Hel l o Wor l d
Dapat dilihat pada cuplikan kode program "Hello World", sebuah aplikasi terdiri setidaknya satu buah namespace, satu buah kelas dan satu buah method statis dengan nama Main. Method statis ini yang dipanggil pertama kali ketika program dijalankan. Perlu diingat bahwa method statis Main, sebaiknya hanya terdapat satu saja per aplikasi. Sebenarnya pada kasus ini namespace tidak perlu digunakan. Bilamana diinginkan namespace dapat dihapus dan aplikasi tetap bekerja. Namespace dibutuhkan bilamana ingin mengelompokan kelas dalam grup. Dalam satu buah namespace sebuah entitas harus unik. Dengan kata lain tidak dimungkinkan ada dua buah kelas dengan nama sama dalam satu buah namespace. Pada method statis Main terdapat satu buah baris kode program yang bertujuan untuk menampilkan sebuah teks ke layar konsol. Menampilkan teks ke layar konsol cukup dengan memanggil method Write() atau WriteLine() pada kelas Console.
Kelas Console Kelas Console adalah kelas yang digunakan untuk melakukan operasi masukan dan keluaran (I/O) pada aplikasi konsol. Operasi keluaran menggunakan dua buah method yaitu Write dan WriteLine. Sedangkan operasi masukan menggunakan method ReadLine. Method Write digunakan untuk menampilkan data ke layar. Sedangkan method WriteLine digunakan untuk menampilkan satu baris data ke layar (kursor pindah ke baris baru). Kode program berikut mendemonstrasikan perbedaan antara kedua method tersebut.
us i ng Sys t em; namespace Wr i t eWr i t eLi ne { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { // Ti ga bar i s ber i kut s ama dengan per i nt ah // Cons ol e. Wr i t eLi ne( "Hi , Apa kabar ? ") ; Cons ol e. Wr i t e( "Hi , ") ; Cons ol e. Wr i t e( "Apa kabar ? ") ; Cons ol e. Wr i t e( "\n") ; Cons ol e. Wr i t eLi ne( "Bai k- bai k s aj a, bukan? ") ;
}
}
}
// Hasi l : // Hi , Apa kabar ? // Bai k- bai k saj a, bukan?
Method ReadLine digunakan untuk "mengambil" satu baris teks (string). Satu baris teks pada method ReadLine adalah kumpulan karakter yang diakhiri oleh karakter enter (carriage return). us i ng Sys t em; namespace ReadLi ne { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Nama Anda: " ) ; s t r i ng nama = Consol e. ReadLi ne( ) ; Cons ol e. Wr i t eLi ne( "Hel l o, { 0 } . " , nama) ;
}
}
}
// Hasi l : // Nama Anda: Ri s al // Hel l o, Ri s al .
Tipe Data dan Variabel Variabel adalah sebuah wadah yang digunakan untuk menyimpan nilai. Dalam bahasa pemrograman (berbeda dengan matematik), variabel memiliki tipe. Variabel dan nilai yang disimpan harus memiliki tipe yang sama. Berikut akan dibahas berbagai macam tipe dasar yang sering digunakan dalam merancang sebuah aplikasi.
Boolean
Boolean adalah tipe data yang digunakan untuk menyimpan nilai true atau false. Pada bahasa pemrograman C#, tipe data boolean dituliskan bool. Tipe data banyak digunakan pada operasi logika. Semua operasi logika pada bahasa pemrograman C# menghasilkan dua kemungkinan nilai, true atau false. us i ng Sys t em; namespace Bool ean { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { bool a = 3 < 7; bool b = "andi " == "Andi "; bool c = a | | b; bool d = a && b; Cons ol e. Wr i t eLi ne( "3 < 7? { 0} " , a) ; Cons ol e. Wr i t eLi ne( "\"andi \" ! = \"Andi \"? { 0} ", b) ; Cons ol e. Wr i t eLi ne( "( 3 < 7) | | ( \"andi \" == \"Andi \") ? { 0} ", c) ; Cons ol e. Wr i t eLi ne( "( 3 < 7) && ( \"andi \" == \"Andi \") ? { 0} ", d) ;
}
}
}
// // // // //
Hasi l : 3 < 7 ? "andi " ! ( 3 < 7) ( 3 < 7)
Tr ue = "Andi " ? Fal se | | ( "andi " == "Andi ") ? Tr ue && ( "andi " == "Andi ") ? Fal s e
Bilangan Integer Bilangan integer adalah tipe data yang digunakan untuk menyimpan bilangan bulat. Bahasa pemrograman C# membagi tipe data integer menjadi dua bagian besar, tipe data integer bertanda (signed integer) dan tipe data integer tak bertanda (unsigned integer). Bilangan integer negatif (< 0) hanya dapat disimpan pada tipe data integer bertanda (signed integer). Tipe data sbyte, short, int, dan long (diurutkan menurut kapasitas, dari kecil ke besar) termasuk pada signed integer. Sedangkan tipe data byte, ushort, uint, dan ulong termasuk pada unsigned integer.
us i ng Sys t em; names pace I nt eger { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { i nt val 1 = 1978; i nt val 2 = 11; i nt add = val 1 + val 2; i nt s ub = val 1 - val 2; i nt mul = val 1 * val 2; i nt di v = val 1 / val 2; i nt mod = val 1 % val 2; Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0}
}
}
}
// // // // // //
Has i l : 1978 + 11 1978 - 11 1978 * 11 1978 / 11 1978 % 11
= = = = =
+ { 1} - { 1} * { 1} / { 1} % { 1}
= = = = =
{ 2} ", { 2} ", { 2} ", { 2} ", { 2} ",
val 1, val 1, val 1, val 1, val 1,
val 2, val 2, val 2, val 2, val 2,
add) ; s ub) ; mul ) ; di v) ; mod) ;
1989 1967 21758 179 9
Bilangan Riil Bilangan riil adalah tipe data yang digunakan untuk menyimpan bilangan berkoma atau biasa dikenal dengan istilah floating point (karena angkanya mengambang antara dua buah angka integer). Bahasa pemrograman C# memiliki dua buah tipe data untuk kebutuhan ini, float dan double. Perbedaan antara keduanya adalah presisi, tipe data double memiliki tingkat keakuratan lebih tinggi dari tipe data float.
us i ng Sys t em; names pace Real { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { doubl e val 1 = 2009; doubl e val 2 = 13. 08; doubl e add = val 1 + val 2; doubl e s ub = val 1 - val 2; doubl e mul = val 1 * val 2; doubl e di v = val 1 / val 2; doubl e mod = val 1 % val 2; Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0}
}
}
}
// // // // // //
Has i l : 2009 + 13. 08 2009 - 13. 08 2009 * 13. 08 2009 / 13. 08 2009 % 13. 08
= = = = =
+ { 1} - { 1} * { 1} / { 1} % { 1}
= = = = =
{ 2} ", { 2} ", { 2} ", { 2} ", { 2} ",
val 1, val 1, val 1, val 1, val 1,
val 2, val 2, val 2, val 2, val 2,
add) ; s ub) ; mul ) ; di v) ; mod) ;
2022. 08 1995. 92 26277. 72 153. 593272171254 7. 75999999999999
Uang Bahasa pemrograman C# menyediakan tipe data khusus yang memiliki tingkat presisi sangat tinggi, tipe data tersebut adalah decimal. Walaupun demikian penggunaan tipe data decimal sebaiknya hanya digunakan untuk operasi yang berhubungan dengan keuangan, karena bukan saja ukurannya yang relatif besar selain itu juga operasi pada tipe data ini tergolong lambat. Kode program untuk uang sengaja dibuat identik dengan kode program riil. Dapat dilihat bahwa hasil ketika menggunakan tipe data decimal memiliki akurasi yang sangat tinggi. Terutama bilamana melihat hasil dari sisa pembagian dua buah nilai. Ketika melakukan penugasan variabel val2 diberikan akhiran m (memiliki arti money) pada angka Hal ini perlu dilakukan karena secara default bilangan berkoma akan dianggap bertipe data double.
us i ng Sys t em; namespace Money { cl as s Pr ogr am { st at i c voi d { deci mal deci mal deci mal deci mal deci mal deci mal deci mal
Mai n( s t r i ng[ ] ar gs ) val 1 = 2009; val 2 = 13. 08m; add = val 1 + val 2; s ub = val 1 - val 2; mul = val 1 * val 2; di v = val 1 / val 2; mod = val 1 % val 2;
Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0} Cons ol e. Wr i t eLi ne( "{ 0}
}
}
}
// // // // // //
Hasi l : 2009 + 13. 08 2009 - 13. 08 2009 * 13. 08 2009 / 13. 08 2009 % 13. 08
= = = = =
+ { 1} - { 1} * { 1} / { 1} % { 1}
= = = = =
{ 2} ", { 2} ", { 2} ", { 2} ", { 2} ",
val 1, val 1, val 1, val 1, val 1,
val 2, val 2, val 2, val 2, val 2,
add) ; s ub) ; mul ) ; di v) ; mod) ;
2022. 08 1995. 92 26277. 72 153. 59327217125382262996941896 7. 76
Tanggal dan Waktu Tanggal dan waktu pada bahasa pemrograman C# disimpan pada satu buah tipe data saja, yaitu DateTime. Selain tipe data DateTime, ada juga tipe data TimeSpan yang digunakan untuk menyimpan selisih waktu. Tipe data DateTime memiliki dua buah property statis yang dapat digunakan untuk mengambil tanggal hari ini dan waktu saat ini. Ketika mengambil tanggal hari ini, nilai waktu selalu 00:00:00 atau pukul 12:00 AM. Bilamana ingin menampilkan Tanggal atau Waktu saja, hal tersebut dapat dilakukan dengan melakukan formatting. Pada tipe data TimeSpan satuan terbesarnya adalah jumlah hari (tidak menyimpan bulan dan tahun).
us i ng Sys t em; namespace Dat eAndTi me { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Dat eTi me dt 1 = new Dat eTi me( 1978, 1, 1) ; Dat eTi me dt 2 = new Dat eTi me( 1986, 9, 30) ; Ti meSpan t s = dt 2 - dt 1; Cons ol e. Wr i t eLi ne( "Har i Cons ol e. Wr i t eLi ne( "Saat Cons ol e. Wr i t eLi ne( "Dat e Cons ol e. Wr i t eLi ne( "Dat e Cons ol e. Wr i t eLi ne( "Span
}
}
}
// // // // // //
i ni : { 0: dd- MM- yyyy, HH: mm: s s} ", Dat eTi me. Today) ; i ni : { 0: dd- MM- yyyy, HH: mm: s s} ", Dat eTi me. Now) ; 1: { 0: dd- MM- yyyy, HH: mm: ss } ", dt 1) ; 2: { 0: dd- MM- yyyy, HH: mm: ss } ", dt 2) ; ant ar a Dat e 1 dan Dat e 2: { 0: dd} " , t s ) ;
Hasi l : Har i i ni : 22 - 01 - 2015, 00: 00: 00 Saat i ni : 22 - 01 - 2015, 10: 34: 42 Dat e 1: 01 - 01 - 1978, 00: 00: 00 Dat e 2: 30 - 09 - 1986, 00: 00: 00 Span ant ar a Dat e 1 dan Dat e 2: 3194
Karakter dan String Tipe data string digunakan untuk menyimpan kumpulan karakter. Sedangkan tipe data char digunakan untuk menyimpan satu buah karakter. Tipe data string merupakan hasil keluaran dari hampir sebagian besar fasiltas masukan yang ada pada bahasa pemrograman C# (mulai dari aplikasi konsol, desktop, web, sampai dengan mobile).
us i ng Sys t em; namespace Char St r i ng { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { char ch1 = ' h' ; char ch2 = ' \x002e' ; s t r i ng t ext = "el l o"; s t r i ng combi ne = ch1 + t ext + ch2; Cons ol e. Wr i t eLi ne( "ch1 = { 0} ", ch1) ; Cons ol e. Wr i t eLi ne( "ch2 = { 0} ", ch2) ; Cons ol e. Wr i t eLi ne( "t ext = { 0} ", t ext ) ; Cons ol e. Wr i t eLi ne( "ch1 + t ext + ch2 = { 0} " , combi ne) ; Cons ol e. Wr i t eLi ne( "char . ToUpper ( ch1) = { 0} ", char . ToUpper ( ch1) ) ; Cons ol e. Wr i t eLi ne( "combi ne. ToUpper ( ) = { 0} ", combi ne. ToUpper ( ) ) ;
}
}
}
// // // // // // //
Hasi l : ch1 = h ch2 = . t ext = el l o ch1 + t ext + ch2 = hel l o. char . ToUpper ( ch1) = H combi ne. ToUpper ( ) = HELLO.
Array Pada bahasa pemrograman C# membuat array cukup dengan mengakhiri tipe data dengan tanda []. Contoh bilamana ingin membuat sebuah array integer maka dituliskan int[]. Array juga menyediakan beberapa fasilitas (method) bantuan, seperti pengurutan data, pencarian data, atau membalik urutan data.
us i ng Sys t em; namespace Ar r ayDemo { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { i nt [ ] val ues = new i nt [ ] { 1, 9, 8, 0 } ; s t r i ng[ ] names = { "Andi ", "Wat i ", "Budi " } ; Cons ol e. Wr i t eLi ne( "Val ues = { 0} ", st r i ng. J oi n( ", ", val ues ) ) ; Cons ol e. Wr i t eLi ne( "Names = { 0} ", s t r i ng. J oi n( ", ", names) ) ; Ar r ay. Sor t ( val ues ) ; Cons ol e. Wr i t eLi ne( "Sor t ed Val ues = { 0} ", s t r i ng. J oi n( ", ", val ues ) ) ; Ar r ay. Sor t ( names ) ; Ar r ay. Rever s e( names ) ; Cons ol e. Wr i t eLi ne( "Sor t ed Names = { 0} ", s t r i ng. J oi n( ", ", names ) ) ;
}
}
}
// // // // //
Hasi l : Val ues = 1, 9, 8, 0 Names = Andi , Wat i , Budi Sor t ed Val ues = 0, 1, 8, 9 Sor t ed Names = Wat i , Budi , Andi
Boxing/Unboxing Boxing adalah sebuah proses mengubah value type menjadi tipe object. Sedangkan unboxing adalah proses mengubah kembali object (yang sebelumnya value type) ke value type. Pada bahasa pemrograman C# yang termasuk value type adalah tipe data boolean, tipe data integer, tipe data riil, decimal, struct, dan enumerasi.
us i ng Sys t em; namespace Boxi ngUnboxi ng { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { i nt s omeVal ue = 1178; Cons ol e. Wr i t eLi ne( "s omeVal ue t ype: { 0} ", s omeVal ue. Get Type( ) ) ; Cons ol e. Wr i t eLi ne( "s omeVal ue val ue: { 0} " , someVal ue) ; Cons ol e. Wr i t eLi ne( ) ; obj ect box = ( obj ect ) s omeVal ue; Cons ol e. Wr i t eLi ne( "box t ype: { 0} ", box. Get Type( ) ) ; Cons ol e. Wr i t eLi ne( "box val ue: { 0} " , box) ; Cons ol e. Wr i t eLi ne( ) ; i nt unbox = ( i nt ) box; Cons ol e. Wr i t eLi ne( "unbox t ype: { 0} ", unbox. Get Type( ) ) ; Cons ol e. Wr i t eLi ne( "unbox val ue: { 0} ", unbox) ;
}
}
}
// // // // // // //
Hasi l : s omeVal ue t ype: Sys t em. I nt 32 s omeVal ue val ue: 1178 box t ype: Sys t em. I nt 32 box val ue: 1178 unbox t ype: Sys t em. I nt 32 unbox val ue: 1178
Proses boxing dan unboxing adalah proses yang membutuhkan komputasi yang besar dan sebaiknya dihindari bilamana dimungkinkan.
Casting Casting adalah proses konversi dari satu tipe data ke tipe data lainnya. Casting dimungkinkan gagal bilamana tipe data tidak kompatibel satu dengan yang lainnya. Casting biasanya dilakukan antar tipe data numerik (contoh: mengubah nilai tipe data double ke tipe data int). Casting pada C# ada dua jenis, yaitu implisit dan eksplisit. Casting Implisit dapat dilakukan bilamana tipe data tujuan memiliki kapasitas lebih besar atau sama dengan tipe data awal (contoh: int ke long, int ke double, dan short ke int). Sedangkan casting eksplisit harus dilakukan bilamana tipe data tujuan memiliki kapasitas lebih kecil atau bilamana konversi dilakukan akan kehilangan presisi (contoh: double ke long, float ke int, dan long ke int).
us i ng Sys t em; namespace Cas t i ng { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { i nt i nt 1 = 17; // I mpl i ci t cas t i ng doubl e dbl 1 = i nt 1; Cons ol e. Wr i t eLi ne( "i nt 1 = { 0} ", i nt 1) ; Cons ol e. Wr i t eLi ne( "dbl 1 = { 0} ", dbl 1) ; Cons ol e. Wr i t eLi ne( ) ; doubl e dbl 2 = 13. 50; // Expl i ci t cas t i ng i nt i nt 2 = ( i nt ) dbl 2; Cons ol e. Wr i t eLi ne( "dbl 2 = { 0} ", dbl 2) ; Cons ol e. Wr i t eLi ne( "i nt 2 = { 0} ", i nt 2) ;
}
}
}
// // // // //
Hasi l : i nt 1 = dbl 1 = dbl 2 = i nt 2 =
17 17 13. 5 13
Parsing Parsing adalah proses mengubah string numerik (angka dalam bentuk string) ke tipe data numerik (contoh: int, long, dan double). Sebagian besar tipe numerik menyediakan dua buah method untuk parsing, yaitu Parse dan TryParse. Walaupun tersedia dua method, untuk melakukan parsing sebaiknya menggunakan TryParse. Berbeda dengan method Parse yang akan melemparkan Exception (berimbas pada performa aplikasi), method TryParse hanya mengembalikan nilai boolean false bilamana proses parsing gagal.
us i ng Sys t em; names pace Par s i ng { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Ni l ai 1? ") ; s t r i ng n1s t r = Cons ol e. ReadLi ne( ) ; Cons ol e. Wr i t e( "Ni l ai 2? ") ; s t r i ng n2s t r = Cons ol e. ReadLi ne( ) ; doubl e n1, n2; n1 = doubl e. Par s e( n1s t r ) ; doubl e. Tr yPar s e( n2s t r , out n2) ; doubl e r es = n1 + n2; Cons ol e. Wr i t eLi ne( "{ 0} + { 1} = { 2} ", n1, n2, r es ) ;
}
}
}
// // // //
Has i l : Ni l ai 1 ? 2 Ni l ai 2 ? 3 2 + 3 = 5
Mengatur Alir Kode Program Kode program selalu dijalankan berurutan sekuensial (atas ke bawah). Bilamana dibutuhkan aliran kode program dapat dimodifikasi sehingga bagian kode program akan dijalankan berulang atau hanya akan dijalankan bilamana kondisi tertentu dipenuhi. Bahasa pemrograman C# memiliki beberapa keyword yang dapat digunakan untuk mengatur alir dari kode program. Beberapa keyword ini dapat dikelompokan menjadi tiga bagian besar (1) analisa kasus/percabangan bersyarat, (2) pengulangan, dan (3) penanganan eksepsi.
Analisa Kasus Analisa kasus atau dikenal dengan percabangan dengan kondisi (conditional branch) adalah sebuah mekanisme yang mengatur aliran kode program untuk menjalankan kumpulan kode program bilamana kondisi dipenuhi. Kata kunci if-else, kata kunci switch-case, dan operator kondisi termasuk dalam kategori ini.
Kata Kunci if-else Kata kunci if-else digunakan untuk melakukan evaluasi dari sebuah kondisi. Bilamana kondisi dipenuhi (menghasilkan true), blok kode program if dijalankan. Bilamana tidak dipenuhi, blok kode program else dijalankan. us i ng Sys t em; names pace I f El s e { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Bi l angan bul at : ") ; s t r i ng val s t r = Cons ol e. ReadLi ne( ) ; i nt val ue; i nt . Tr yPar s e( val s t r , out val ue) ; i f ( val ue % 2 == 1) { Cons ol e. Wr i t eLi ne( "Ganj i l ") ; } el s e { Cons ol e. Wr i t eLi ne( "Genap") ; }
}
}
}
// Has i l : // Bi l angan bul at : 173 // Ganj i l
Perlu diingat kata kunci if dapat berdiri sendiri (tanpa else). Sedangkan kata kunci else hanya dapat ada bilamana dipasangkan dengan kata kunci if.
Kata Kunci switch-case Berbeda dengan kata kunci if-else, kata kunci switch case tidak melakukan evaluasi kondisi boolean melainkan membandingkan isi variabel dengan konstanta yang ada pada tiap pernyataan case. Bilamana ada yang cocok, maka kode program pada blok case tersebut dijalankan. Bilamana tidak ada yang cocok (dan blok default tersedia) maka kode program pada blok default yang dijalankan. us i ng Sys t em; namespace Swi t chCas e { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Masukan ni l ai mut u ( A- E) : ") ; s t r i ng nmut u = Cons ol e. ReadLi ne( ) ; s wi t ch ( nmut u. ToLower ( ) ) { cas e "a": cas e "b": cas e "c": Cons ol e. Wr i t eLi ne( "Sel amat Anda l ul us. ") ; br eak; cas e "d": cas e "e": Cons ol e. Wr i t eLi ne( "Maaf Anda har us mengul ang mat a kul i ah i ni . ") ; br eak; def aul t : Cons ol e. Wr i t eLi ne( "Maaf , ni l ai yang di kenal i hanya A- E. ") ; br eak; }
}
}
}
// Hasi l : // Masukan ni l ai mut u ( A- E) : B // Sel amat Anda l ul us .
Pada contoh program sebelumnya dapat dilihat bahwa, isi dari variabel nmutu diubah terlebih dahulu menjadi huruf kecil untuk menyederhanakan konstanta pada case. Bilamana isi dari nmutu adalah "a" sampai dengan "c" maka menampilkan pesan yang sama "Selamat Anda lulus". Perlu diingat, tiap blok case dan blok default harus diakhiri oleh kaya kunci break. Kompiler akan menampilkan pesan kesalahan, bilamana kata kunci break lupa disertakan. Serupa dengan kata kunci if-else, kata kunci default tidak harus ada.
Operator Kondisi Operator kondisi akan mengembalikan satu dari dua buah nilai tergantung dari hasil ekspresi boolean. Bilamana hasil evaluasi bernilai true, maka ekspresi pertama yang dievaluasi, selain itu maka ekspresi kedua yang dievaluasi. us i ng Sys t em; names pace Oper at or Kondi s i { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Mas ukan s ebuah bi l angan bul at : ") ; s t r i ng val s t r = Cons ol e. ReadLi ne( ) ; i nt val ; i nt . Tr yPar s e( val s t r , out val ) ; Cons ol e. Wr i t eLi ne( "Menggunakan i f - el s e: ") ; i f ( ( val % 2) == 1) { Cons ol e. Wr i t eLi ne( "Bi l angan ganj i l ") ; } el s e { Cons ol e. Wr i t eLi ne( "Bi l angan genap") ; } Cons ol e. Wr i t eLi ne( "Menggunakan oper at or kondi s i : ? ") ; s t r i ng r es ul t = ( ( val % 2) == 1) ? "Bi l angan ganj i l " : "Bi l angan genap" ; Cons ol e. Wr i t eLi ne( r es ul t ) ;
}
}
}
// // // // // //
Has i l : Mas ukan s ebuah bi l angan bul at : 17 Menggunakan i f - el s e: Bi l angan ganj i l Menggunakan oper at or kondi s i : ? Bi l angan ganj i l
Pengulangan Pengulangan (loop) adalah sebuah mekanisme untuk mengulang satu atau sekelompok kode program. Bahasa pemrograman C# mengenal tiga buah kata kunci yang dapat digunakan untuk mengulang kode program (kata kunci for, kata kunci foreach, dan kata kunci do-while). Dari ketiga kata kunci tersebut ada satu yang dirancang khusus untuk melakukan iterasi pada sebuah kumpulan (collection), kata kunci yang dimaksud adalah foreach.
Kata Kunci for
Kata kunci for digunakan untuk mengulang sekelompok kode program selama ekspresi boolean bernilai true. Kata kunci ini cocok digunakan untuk pengulangan yang jumlah pengulangannya diketahui di awal (contoh: iterasi array, membuat tabel perkalian, dan menghitung jumlah dari deret matematik). us i ng Sys t em; namespace For { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Besar s egi t i ga? ") ; s t r i ng s i zest r = Cons ol e. ReadLi ne( ) ; i nt s i ze; i nt . Tr yPar s e( si zes t r , out s i ze) ; f or ( i nt r ow = 1; r ow <= s i ze; ++r ow) { f or ( i nt col = 1; col <= r ow; ++col ) { Cons ol e. Wr i t e( "* ") ; } Consol e. Wr i t eLi ne( ) ; }
}
}
}
// // // // // // //
Hasi l : Besar s egi t i ga? 5 * ** *** **** *****
Kata Kunci foreach Kata kunci foreach digunakan khusus untuk iterasi kumpulan data (collection). Proses penambahan/penghapusan data menggunakan kata kunci ini sebaiknya dihindari. Pada foreach kata kunci break digunakan untuk menghentikan pengulangan, sedangkan kata kunci continue untuk melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya.
us i ng Sys t em; namespace For Each { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { i nt [ ] s omeVal ues = { 19, 78, 1, 30, 9, 80, 20, 13 } ; s t r i ng r es ul t = "{ "; f or each ( i nt val ue i n s omeVal ues ) { r es ul t += val ue; r es ul t += ", "; } // Pada t ahap i ni "{ 19, 78, 1, 30, 9, 80, 20, 13, " // Supaya di dapat has i l "{ 19, 78, 1, 30, 9, 80, 20, 13 } ", maka: // 1. Hapus dua kar akt er t er akhi r // 2. Tambah spas i dan kur ung t ut up " } " r es ul t = r es ul t . Remove( r esul t . Lengt h - 2) ; r es ul t += " } ";
}
}
}
Cons ol e. Wr i t eLi ne( r es ul t ) ; // Hasi l : // { 19, 78, 1, 30, 9, 80, 20, 13 }
Kata Kunci do-while Kata kunci do-while digunakan bilamana ingin melakukan iterasi yang jumlah iterasinya belum diketahui atau memiliki kondisi pengulangan yang kompleks. Kata kunci do-while memiliki dua variasi penggunaan (1) while dan (2) do-while. Pada variasi while, evaluasi kondisi dilakukan di awal ketika masuk pengulangan. Sehingga dimungkinkan kode program yang ingin diulang tidak dijalankan sama sekali (bilamana kondisi sudah terpenuhi).
us i ng Sys t em; namespace Whi l e { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "N = ") ; s t r i ng ns t r = Consol e. ReadLi ne( ) ; i nt n, count = 1; i nt . Tr yPar s e( ns t r , out n) ; whi l e ( count <= n) { Consol e. Wr i t e( "{ 0} ", count ) ; ++count ; } Cons ol e. Wr i t eLi ne( ) ;
}
}
}
// // // // // //
Hasi l : N= 5 1 2 3 4 5 N= 0
Pada variasi do-while, evaluasi kondisi dilakukan di akhir, setelah menjalankan kode program yang ingin diulang. Sehingga setidaknya kode program (yang ada dalam blok kode do-while) dijalankan minimal satu kali.
us i ng Sys t em; namespace DoWhi l e { cl as s Pr ogr am { st at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "N = ") ; s t r i ng ns t r = Consol e. ReadLi ne( ) ; i nt n, count = 1; i nt . Tr yPar s e( ns t r , out n) ; do { Consol e. Wr i t e( "{ 0} ", count ) ; ++count ; } whi l e ( count <= n) ; Cons ol e. Wr i t eLi ne( ) ;
}
}
}
// // // // // //
Hasi l : N= 5 1 2 3 4 5 N= 0 1
Penanganan Eksepsi Bahasa pemrograman C# menggunakan kata kunci try-catch-finally untuk menangani eksepsi. Blok kode try digunakan untuk menyimpan kode program yang mungkin menghasilkan eksepsi. Blok kode catch digunakan untuk menangani eksepsi yang terjadi. Blok kode catch bisa lebih dari satu buah, karena satu blok catch hanya menangani satu jenis eksepsi. Sedangkan blok kode finally biasanya digunakan untuk membebaskan sumberdaya yang digunakan pada blok kode try. Blok kode finally pasti selalu dijalankan bilamana eksepsi ditangani. Contoh program berikut (ketika dijalankan) membuka sebuah berkas teks bernama "sample.txt". Bilamana berkas tersebut tidak ditemukan maka eksepsi akan terjadi dan blok kode catch dijalankan. Bilamana berkas tersebut ada maka akan menampilkan baris pertama dari berkas "sample.txt"
us i ng Sys t em; us i ng Sys t em. I O; names pace Tr yCat chFi nal l y { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { St r eamReader s r = nul l ; try {
s r = Fi l e. OpenText ( "s ampl e. t xt ") ; s t r i ng t xt = s r . ReadLi ne( ) ;
Cons ol e. Wr i t eLi ne( t xt ) ; } cat ch ( Fi l eNot FoundExcept i on) { Cons ol e. Wr i t eLi ne( "Fi l e not f ound. ") ; Cons ol e. Wr i t e( "Sol ut i on: ") ; Cons ol e. Wr i t eLi ne( "Cr eat e s ampl e. t xt f i l e at execut abl e l ocat i on. ") ; } f i nal l y { i f ( s r ! = nul l ) { s r . Cl os e( ) ; } }
}
}
}
// Has i l : // Fi l e not f ound. // Sol ut i on: Cr eat e s ampl e. t xt f i l e at execut abl e l ocat i on.
Membuat Sebuah Kelas Dalam pemrograman berorientasi objek, kelas dan objek merupakan komponen utama dalam membuat sebuah aplikasi. Sebuah aplikasi merupakan kolaborasi antara kelas/objek untuk menyelesaikan sebuah masalah. Sebelum dapat dibuat sebuah objek maka pengembang perlu untuk membuat spesifikasi/pola dari objek itu sendiri. Spesifikasi/pola dari objek dikenal dengan nama kelas. Kelas terdiri dari dua komponen utama, yaitu atribut dan operasi. Pada bahasa pemrograman atribut dimodelkan dengan field. Sedangkan operasi dimodelkan dengan method. Bahasa pemrograman C# mengenal satu buah komponen lagi yang ada pada sebuah kelas, komponen tersebut dikenal dengan nama property.
Pada gambar sebelumnya dapat dilihat bahwa, kelas User memiliki dua buah atribut dan lima buah method. Dua pasang method berupa aksesor/mutator dan satu buah method digunakan untuk memeriksa apakah username/password sesuai dengan yang ada dalam kelas.
us i ng Sys t em; names pace Kel as { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Us er us r = new Us er ( ) { Us er name = "Ri s al ", Pas s wor d = "MCU50t h" }; s t r i ng name = "J ames "; s t r i ng pwd = "Agent 007"; Cons ol e. Wr i t eLi ne( "Aut hent i cat e( \"{ 0} \", \"{ 1} \") == { 2} ", name, pwd, us r . Aut hent i cat e( name, pwd) ) ;
}
}
// Has i l : // Aut hent i cat e( "J ames ", "Agent 007") == f al s e
publ i c cl as s Us er { pr i vat e s t r i ng us er name; pr i vat e s t r i ng pas s wor d; publ i c s t r i ng Us er name { get { r et ur n us er name; } s et { us er name = val ue; } } publ i c s t r i ng Pas s wor d { get { r et ur n pas s wor d; } s et { pas s wor d = val ue; } }
}
}
publ i c bool Aut hent i cat e( s t r i ng us er name, s t r i ng pas s wor d) { r et ur n ( ( Us er name. ToLower ( ) == us er name. ToLower ( ) ) && ( Pas s wor d == pas s wor d) ) ; }
Pada bahasa pemrograman C#, aksesor/mutator dibuat dalam bentuk property. Field, method, dan property dibahas lebih detail pada sub-bab berikut.
Peubah Akses Peubah akses adalah komponen penting untuk terjaminnya enkapsulasi. Peubah akses digunakan untuk mengatur aksesibilitas sebuah tipe dan anggotanya (field,
method, dan property). Peubah akses pada bahasa C# ada empat, yaitu private, public, protected, dan internal. Bilamana sebuah entitas ingin agar dapat bebas diakses oleh tipe atau objek lain, maka gunakan public. Peubah akses private digunakan agar hanya dapat diakses oleh tipe itu sendiri. Peubah akses protected digunakan agar hanya dapat diakses oleh tipe dan turunan dari tipe itu sendiri. Sedangkan internal digunakan untuk membatasi tipe agar dapat diakses oleh semua tipe/objek dalam satu assembly. us i ng Sys t em; names pace PeubahAks es { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Human human = new Human( ) ; // OK: Aks es anggot a PUBLI C human. Name = "Budi "; // ERROR: Ti dak bol eh aks es anggot a PRI VATE // human. name = "I wan"; Cons ol e. Wr i t eLi ne( human. Name) ;
}
}
// Has i l : // Budi
publ i c cl as s Human { pr i vat e s t r i ng name;
}
}
publ i c s t r i ng Name { get { r et ur n name; } s et { name = val ue; } }
Pada contoh program ini dapat dilihat, kelas Program hanya dapat mengakses anggota public dari kelas lain (Human). Bilamana kelas Program, mengakses anggota private dari kelas Human, maka compiler menampilkan pesan kesalahan.
Field Atribut dalam sebuah kelas dimodelkan menggunakan field. Field adalah sebuah variabel yang digunakan untuk enkapsulasi data yang ada dalam kelas. Pada bahasa pemrograman C# field biasanya memiliki peubah akses private atau protected. Sesuai dengan fungsinya yang digunakan untuk memodelkan sebuah atribut, nama field menggunakan kata benda.
us i ng Sys t em; names pace Fi el d { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Pos i s i 2D pos = new Pos i s i 2D( ) ; Cons ol e. Wr i t eLi ne( "Pos ( { 0} , { 1} ) " , pos . X, pos . Y) ; pos . Set XY( 12, 13) ; Cons ol e. Wr i t eLi ne( "Pos ( { 0} , { 1} ) " , pos . X, pos . Y) ;
}
}
// Has i l : // Pos ( 0, 0) // Pos ( 12, 13)
publ i c cl as s Pos i s i 2D { publ i c doubl e X = 0; publ i c doubl e Y = 0;
}
}
publ i c voi d Set XY( doubl e x, doubl e y) { X = x; Y = y; }
Konstanta Konstanta adalah sebuah nilai yang dikenali pada saat kompilasi (compile time) dan tidak berubah sepanjang aplikasi hidup. Konstanta pada bahasa pemrograman C# dapat dibuat dengan menambahkan kata kunci const pada field. Perlu diingat peubah konstanta (const) mewajibkan field diinisialisasi langsung dengan sebuah nilai.
names pace Kons t ant a { publ i c cl as s Pos i s i 2D { pr i vat e cons t i nt Zer o = 0; // ERROR: Kons t ant a har us di i ni s i al i s as i // pr i vat e cons t i nt One; pr i vat e i nt x = Zer o; pr i vat e i nt y = Zer o;
}
}
publ i c i nt X { get { r et ur n x; } s et { x = val ue; } } publ i c i nt Y { get { r et ur n y; } s et { y = val ue; } }
Kata kunci const hanya dapat dipadankan dengan tipe data dasar (bool, byte, sbyte, char, decimal, double, float, int, uint, long, ulong, short, ushort, dan string). Bilamana dibutuhkan sebuah konstanta dengan tipe data bentukan, maka dapat menggunakan kata kunci readonly.
Readonly Readonly adalah kata kunci yang ada pada bahasa pemrograman C# yang betujuan membuat sebuah konstanta yang dikenali saat aplikasi dijalankan (run time). Readonly field hanya dapat diinisialisasi saat dibuat (sama seperti konstanta) atau pada constructor. Pada contoh program dapat dilihat, berbeda dengan peubah konstanta yang tidak memungkinkan menggunakan tipe data bentukan (hanya tipe data dasar), peubah readonly juga memungkinkan untuk melakukan menunda lakukan inisialisasi. Dalam kasus ini
names pace ReadOnl y { publ i c cl as s Pos i s i 2D { publ i c s t at i c r eadonl y Pos i s i 2D Zer o = new Pos i s i 2D( ) ; pr i vat e r eadonl y Pos i s i 2D def aul t Pos i t i on; pr i vat e i nt x = 0; pr i vat e i nt y = 0; publ i c Pos i s i 2D( ) { } publ i c Pos i s i 2D( i nt x, i nt y) { // Buat s ebuah Pos i s i 2D unt uk s i mpan ni l ai def aul t def aul t Pos i t i on = new Pos i s i 2D( ) ; def aul t Pos i t i on. X = x; def aul t Pos i t i on. Y = y;
}
// Set ni l ai X dan Y X = x; Y = y;
publ i c i nt X { get { r et ur n x; } s et { x = val ue; } } publ i c i nt Y { get { r et ur n y; } s et { y = val ue; } }
}
}
publ i c voi d Res et ( ) { // Gunakan Def aul t Pos i t i on unt uk r es et ni l ai X dan Y X = def aul t Pos i t i on. X; Y = def aul t Pos i t i on. Y; }
Method Method adalah operasi yang dapat dilakukan oleh kelas. Method dikenal juga dengan nama lain seperti prosedur/fungsi. Sebuah method memiliki nama, parameter, dan nilai kembalian. Berbeda dengan field, method biasanya memiliki peubah akses public atau protected. Sesuai dengan fungsinya yang digunakan untuk memodelkan operasi, nama method menggunakan kata kerja.
names pace Met hod { publ i c cl as s Tel evi s i on { pr i vat e i nt channel = 1; pr i vat e i nt vol ume = 0; publ i c i nt Channel { get { r et ur n channel ; } } publ i c i nt Vol ume { get { r et ur n vol ume; } } publ i c i nt Next Channel ( ) { channel ++; i f ( channel > 40) channel = 1; }
r et ur n channel ;
publ i c i nt Pr evChannel ( ) { channel - - ; i f ( channel < 1) channel = 40;
}
}
}
r et ur n channel ;
Contoh program terlampir mendemonstrasikan penggunaan method. Method NextChannel() digunakan untuk menambah nilai channel dengan satu, kemudian mengembalikan nilai channel (yang sudah ditambah satu). Method PrevChannel() kebalikan dari method NextChannel(), mengurangi nilai channel dengan satu, kemudian mengembalikan nilai channel terkini.
Property Property adalah anggota kelas (pada bahasa pemrograman C#) yang biasanya digunakan sebagai mekanisme untuk membaca/mengubah nilai dari field. Bahasa pemrograman lainnya biasanya dua buah method untuk memodelkan property. Method ini dikenal dengan nama aksesor dan mutator.
us i ng Sys t em; us i ng Sys t em. Secur i t y. Cr ypt ogr aphy; us i ng Sys t em. Text ; names pace Pr oper t y { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Us er us r = new Us er ( "Ri s al Law", "PboC#2015") ; Cons ol e. Wr i t e( "Has i l val i das i us er \"Lea\": ") ; Cons ol e. Wr i t eLi ne( us r . Val i dat e( "Lea", "PBOC#2015" ) ) ; Cons ol e. Wr i t e( "Has i l val i das i us er \"r i s al l aw\": ") ; Cons ol e. Wr i t eLi ne( us r . Val i dat e( "r i s al l aw" , "PboC#2015" ) ) ;
}
}
// Has i l : // Has i l val i das i us er "Lea": Fal s e // Has i l val i das i us er "r i s al l aw": Tr ue
publ i c cl as s Us er { pr i vat e s t r i ng name; pr i vat e s t r i ng pas s wor d; publ i c Us er ( s t r i ng name, s t r i ng pas s wor d) { Name = name; Pas s wor d = pas s wor d; } publ i c s t r i ng Comput eHas hSt r i ng( s t r i ng t ext ) { // Si apkan cl as s unt uk enkr i ps i t eks SHA256Managed al go = new SHA256Managed( ) ; // Conver t s t r i ng ke ar r ay byt e byt e[ ] pl ai n = Encodi ng. ASCI I . Get Byt es ( t ext ) ; // Enkr i ps i dat a byt e[ ] ci pher = al go. Comput eHas h( pl ai n) ;
}
// Conver t has i l enkr i ps i ke s t r i ng Bas e64 r et ur n Conver t . ToBas e64St r i ng( ci pher ) ;
// Readonl y pr oper t y publ i c s t r i ng Name { get { r et ur n name; } pr ot ect ed s et { name = val ue; } } // Wr i t eonl y pr oper t y publ i c s t r i ng Pas s wor d { pr ot ect ed get { r et ur n pas s wor d; } s et { pas s wor d = Comput eHas hSt r i ng( val ue) ; }
Tidak berbeda jauh dengan bahasa pemrograman lain, property terdapat dua buah blok kode program yang digunakan untuk memodelkan fungsionalitas ini. Blok kode get untuk aksesor, sedangkan blok kode set untuk mutator. Bilamana sebuah property hanya memiliki bagian aksesor saja (blok kode get) atau blok kode set memiliki peubah akses bukan public, maka dikenal dengan nama read-only property. Begitu juga sebaliknya, bilamana sebuah property hanya memiliki bagian mutator saja (blok kode set) atau blok kode get memiliki peubah akses bukan public, maka dikenal dengan nama write-only property.
Constructor Constructor adalah sebuah method khusus yang dipanggil ketika objek dibuat. Constructor memiliki nama yang sama dengan nama kelas/struct dan tidak memiliki tipe kembalian. Bilamana sebuah kelas/struct tidak memiliki constructor maka compiler akan otomatis menambahkan sebuah default constructor (constructor tanpa parameter).
us i ng Sys t em; names pace Cons t r uct or { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { // Buat s ebuah obj ek pos 1 dengan ni l ai def aul t ( 0, 0) Pos i s i 2D pos 1 = new Pos i s i 2D( ) ; // Buat s ebuah obj ek pos 2 dengan ni l ai ( 4, 3) Pos i s i 2D pos 2 = new Pos i s i 2D( 4, 3) ; Cons ol e. Wr i t eLi ne( "( { 0} , { 1} ) " , pos 1. X, pos 1. Y) ; Cons ol e. Wr i t eLi ne( "( { 0} , { 1} ) " , pos 2. X, pos 2. Y) ;
}
}
// Has i l : // ( 0, 0) // ( 4, 3)
publ i c cl as s Pos i s i 2D { pr i vat e i nt x = 0; pr i vat e i nt y = 0; // Cons t r uct or t anpa par amet er ( def aul t cons t r uct or ) publ i c Pos i s i 2D( ) { } // Cons t r uct or dengan par amet er ( par amet er i zed cons t r uct or ) publ i c Pos i s i 2D( i nt x, i nt y) { X = x; Y = y; } publ i c i nt X { get { r et ur n x; } s et { x = val ue; } }
}
}
publ i c i nt Y { get { r et ur n y; } s et { y = val ue; } }
Selain default constructor, sebuah kelas dapat juga memiliki constructor dengan parameter (parameterized constructor). Jumlah constructor dan jenis constructor yang dimiliki oleh sebuah kelas tidak memiliki batasan, selama tidak ada constructor yang memiliki pola sama.
Overloading
Overloading atau biasa juga dikenal dengan nama method overloading adalah ketika ada lebih dari satu method dengan nama yang sama (dalam satu entitas), tetapi memiliki pola yang berbeda. Pola disini adalah jumlah parameter atau tipe data dari parameter yang ada pada method tersebut, buka tipe data kembalian. Hal ini berlaku juga dengan constructor. names pace Over l oadi ng { publ i c cl as s Ses uat u { publ i c voi d Foo( ) { } // Nama s ama Foo, ber beda pol a // 1 par amet er , t i pe i nt publ i c voi d Foo( i nt val ) { } // Nama s ama Foo, ber beda pol a // 2 par amet er , t i pe i nt dan s t r i ng publ i c voi d Foo( i nt val , s t r i ng t xt ) { } // Nama s ama Foo, ber beda pol a // 2 par amet er , t i pe s t r i ng dan i nt publ i c voi d Foo( s t r i ng t xt , i nt val ) { }
}
}
// // // //
Ti dak di per kenankan Nama s ama Foo, s ama pol a 1 par amet er , t i pe i nt publ i c i nt Foo( i nt val ) { r et ur n 0; }
Operator Overloading Operator overloading memungkinkan pengembang untuk mengganti cara kerja operator yang ada, sesuai dengan kebutuhan. Operator overloading sangat berguna dan cocok untuk perancangan tipe matematis (contoh: koordinat atau vektor). Bahasa pemrograman C# memperbolehkan pengembang untuk melakukan overloading operator berikut: • Operator unary: +, -, !, ~, ++, --, true, dan false. • Operator biner: +, -, *, /, %, &, |, ^, <<, dan >>. • Operator perbandingan: ==, !=, <, >, <=, dan >=.
us i ng Sys t em; names pace Oper at or Over l oadi ng { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Vect or v1 = new Vect or ( 2, 3) ; Vect or v2 = new Vect or ( 3, 2) ; Vect or v3 = v1 + v2; Cons ol e. Wr i t eLi ne( "v1 + v2 = ( { 0} , { 1} ) " , v3. X, v3. Y) ; Vect or v4 = v1 - v2; Cons ol e. Wr i t eLi ne( "v1 - v2 = ( { 0} , { 1} ) " , v4. X, v4. Y) ;
}
}
// Has i l : // v1 + v2 = ( 5, 5) // v1 - v2 = ( - 1, 1)
publ i c s t r uct Vect or { pr i vat e doubl e x; pr i vat e doubl e y; publ i c Vect or ( doubl e x, doubl e y) { t hi s . x = x; t hi s . y = y; } publ i c doubl e X { get { r et ur n x; } s et { x = val ue; } } publ i c doubl e Y { get { r et ur n y; } s et { y = val ue; } } publ i c s t at i c Vect or oper at or +( Vect or v1, Vect or v2) { Vect or r es ul t = new Vect or ( ) ; r es ul t . X = v1. X + v2. X; r es ul t . Y = v1. Y + v2. Y; r et ur n r es ul t ; }
}
}
publ i c s t at i c Vect or oper at or - ( Vect or v1, Vect or v2) { Vect or r es ul t = new Vect or ( ) ; r es ul t . X = v1. X - v2. X; r es ul t . Y = v1. Y - v2. Y; r et ur n r es ul t ; }
Namespace Namespace digunakan untuk mengelompokan objek yang terkait. Pengelompokan ini memungkinkan pengembang untuk membuat entitas dengan nama yang sama pada namespace berbeda. Namespace dapat dianalogikan seperti sebuah folder dimana dalam satu buah folder hanya nama file harus unik. Bilamana pengembang tidak membuat namespace maka compiler akan membuatkan sebuah namespace default (tanpa nama). Namespace default ini dikenal dengan nama global namespace. us i ng Sys t em; // Buat al i as , t i dak bol eh ada ent i t as dengan nama s ama dal am s at u names pace us i ng Pos = Names pace. I nner . Pos i t i on; names pace Names pace { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Pos i t i on p1 = new Pos i t i on( ) ; p1. X = 1; p1. Y = 2; Cons ol e. Wr i t eLi ne( "( { 0} , { 1} ) " , p1. X, p1. Y) ; // Sama dengan per nyat aan ber i kut : // Names pace. I nner . Pos i t i on p2 = new Names pace. I nner . Pos i t i on( ) Pos p2 = new Pos ( ) ; p2. X = 2; p2. Y = 4; p2. Z = 6; Cons ol e. Wr i t eLi ne( "( { 0} , { 1} , { 2} ) " , p2. X, p2. Y, p2. Z) ;
}
}
// Has i l : // ( 1, 2) // ( 2, 4, 6)
publ i c s t r uct Pos i t i on { publ i c i nt X; publ i c i nt Y; }
}
names pace I nner { publ i c s t r uct Pos i t i on { publ i c i nt X; publ i c i nt Y; publ i c i nt Z; } }
Berkaitan erat dengan namespace, kata kunci using digunakan untuk memudahkan pemanggilan kelas dalam namespace. Perlu diingat bahwa aturan satu buah ruang
lingkup nama entitas harus unik tetap berlaku. Jadi bilamana ketika menggunakan using ada dua buah entitas dengan nama sama, maka ketika entitas tersebut digunakan compiler akan menampilkan pesan kesalahan.
Static Kata kunci static adalah peubah yang dapat ditambahkan pada kelas, field, method, dan property. Kata kunci static bilamana ditambahkan pada kelas, maka kelas tersebut tidak dapat dibuat instansnya. Kelas statis pasti memiliki anggota (field, method, dan property) static. us i ng Sys t em; names pace St at i cCl as s { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t eLi ne( "Fact or i al ( 10) = { 0: #, 0} " , Mat hX. Fact or i al ( 10) ) ; Cons ol e. Wr i t eLi ne( "Si gn( - 273) = { 0} ", Mat hX. Si gn( - 273) ) ;
}
}
// Has i l : // Fact or i al ( 10) = 3, 628, 800 // Si gn( - 273) = - 1
publ i c s t at i c cl as s Mat hX { publ i c s t at i c ul ong Fact or i al ( ul ong max) { ul ong r es ul t = 1; f or ( ul ong count = 2; count <= max; ++count ) r es ul t * = count ; }
}
}
r et ur n r es ul t ;
publ i c s t at i c i nt Si gn( i nt val ) { r et ur n ( val < 0) ? - 1 : ( val > 0) ? 1 : 0; }
Berbeda dengan kelas statis, kelas biasa dapat memiliki anggota statis dan nonstatis. Anggota statis dapat diakses lewat kelas, sedangkan anggota non-statis dapat diakses lewan instansnya (objek). Dengan kata lain kata kunci static pada anggota kelas (method/property) mengakibatkan anggota kelas tersebut dapat dipanggil tanpa dibuat instansnya.
us i ng Sys t em; names pace St at i cFi el d { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Count er c1 = new Count er ( ) ; Cons ol e. Wr i t eLi ne( "Ni l ai c1 = " + c1. Val ue) ; Cons ol e. Wr i t eLi ne( ) ; Count er c2 = new Count er ( ) ; Cons ol e. Wr i t eLi ne( "Ni l ai c1 ( s et el ah ada c2) = " + c1. Val ue) ; Cons ol e. Wr i t eLi ne( "Ni l ai c2 = " + c2. Val ue) ;
}
}
// // // // //
Has i l : Ni l ai c1 = 1 Ni l ai c1 ( s et el ah ada c2) = 1 Ni l ai c2 = 2
publ i c cl as s Count er { pr i vat e s t at i c i nt count = 0; pr i vat e i nt val ue; publ i c Count er ( ) { count ++; val ue = count ; }
}
}
publ i c i nt Val ue { get { r et ur n val ue; } }
Kata kunci static bilamana ditambahkan pada sebuah field memiliki kegunaan tersendiri. Kata kunci static pada field digunakan untuk membagi nilai field bersamasama oleh tiap instans (objek) dari kelas tersebut. Pada contoh program dapat dilihat bahwa nilai count dipakai bersama oleh objek instans kelas Counter. Hal ini dapat dilihat nilai field value dari objek c2 diset dengan nilai count berikutnya.
Struct Struct digunakan untuk memodelkan sebuah tipe data nilai (value type). Berbeda dengan kelas, penugasan pada struct akan melakukan proses duplikasi nilai bukan duplikasi referensi (alamat). Struct memiliki beberapa fitur, yaitu: • Field tidak dapat diinisialisasi langsung, kecuali field tersebut konstanta/statis. • Tidak dapat memiliki default constructor. • Penugasan pada struct akan melakukan duplikasi nilai.
• Membuat instans struct tidak membutuhkan kata kunci new. • Tidak dapat inherit kelas/struct lainnya. • Diperbolehkan untuk implement interface. Karena fitur ini, struct banyak digunakan untuk memodelkan tipe data sederhana. us i ng Sys t em; names pace St r uct { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Poi nt p1 = new Poi nt ( ) ; Poi nt p2 = new Poi nt ( 3, 4) ; Cons ol e. Wr i t eLi ne( p1) ; Cons ol e. Wr i t eLi ne( "Lengt h = " + p1. Lengt h) ; Cons ol e. Wr i t eLi ne( p2) ; Cons ol e. Wr i t eLi ne( "Lengt h = " + p2. Lengt h) ;
}
}
// // // // //
Has i l : ( 0, 0) Lengt h = 0 ( 3, 4) Lengt h = 5
publ i c s t r uct Poi nt { publ i c i nt X; publ i c i nt Y; publ i c Poi nt ( i nt x, i nt y) { X = x; Y = y; } publ i c doubl e Lengt h { get { r et ur n Mat h. Sqr t ( X * X + Y * Y) ; } }
}
}
publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "( { 0} , { 1} ) " , X, Y) ; }
Class vs Struct Sudah dipaparkan sebelumnya, bahwa struct adalah tipe data nilai (value type) sedangkan kelas adalah tipe data referensi (reference type). Perbedaan utama dari
keduanya terlihat ketika melakukan penugasan (assignment) dan lokasi penyimpanannya.
us i ng Sys t em; names pace Cl as s St r uct { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { SomeCl as s s c1 = new SomeCl as s ( ) ; s c1. Val ue = 16; SomeCl as s s c2 = s c1; Cons ol e. Wr i t eLi ne( "Cl as s ( Ref er ence Type) " ) ; Cons ol e. Wr i t eLi ne( "Set el ah penugas an s c2 = s c1: " ) ; Cons ol e. Wr i t eLi ne( "s c1. Val ue = " + s c1. Val ue) ; Cons ol e. Wr i t eLi ne( "s c2. Val ue = " + s c2. Val ue) ; Cons ol e. Wr i t eLi ne( ) ; s c2. Val ue = 19; Cons ol e. Wr i t eLi ne( "Set el ah mengubah Val ue s c2: " ) ; Cons ol e. Wr i t eLi ne( "s c1. Val ue = " + s c1. Val ue) ; Cons ol e. Wr i t eLi ne( "s c2. Val ue = " + s c2. Val ue) ; Cons ol e. Wr i t eLi ne( ) ; Cons ol e. Wr i t eLi ne( ) ; SomeSt r uct s s 1 = new SomeSt r uct ( ) ; s s 1. Val ue = 16; SomeSt r uct s s 2 = s s 1; Cons ol e. Wr i t eLi ne( "St r uct ( Val ue Type) " ) ; Cons ol e. Wr i t eLi ne( "Set el ah penugas an s s 2 = s s 1: " ) ; Cons ol e. Wr i t eLi ne( "s s 1. Val ue = " + s s 1. Val ue) ; Cons ol e. Wr i t eLi ne( "s s 2. Val ue = " + s s 2. Val ue) ; Cons ol e. Wr i t eLi ne( ) ; s s 2. Val ue = 19; Cons ol e. Wr i t eLi ne( "Set el ah mengubah Val ue s s 2: " ) ; Cons ol e. Wr i t eLi ne( "s s 1. Val ue = " + s s 1. Val ue) ; Cons ol e. Wr i t eLi ne( "s s 2. Val ue = " + s s 2. Val ue) ;
}
}
// // // // // // // // // // // // // // // //
Has i l : Cl as s ( Ref er ence Type) Set el ah penugas an s c2 = s c1: s c1. Val ue = 16 s c2. Val ue = 16 Set el ah mengubah Val ue s c2: s c1. Val ue = 19 s c2. Val ue = 19 St r uct ( Val ue Type) Set el ah penugas an s s 2 = s s 1: s s 1. Val ue = 16 s s 2. Val ue = 16 Set el ah mengubah Val ue s s 2: s s 1. Val ue = 16 s s 2. Val ue = 19
publ i c cl as s SomeCl as s { pr i vat e i nt val ue;
}
publ i c i nt Val ue { get { r et ur n val ue; } s et { t hi s . val ue = val ue; } }
publ i c cl as s SomeCl as s { pr i vat e i nt val ue;
}
publ i c i nt Val ue { get { r et ur n val ue; } s et { t hi s . val ue = val ue; } }
publ i c s t r uct SomeSt r uct { pr i vat e i nt val ue;
}
}
publ i c i nt Val ue { get { r et ur n val ue; } s et { t hi s . val ue = val ue; } }
Tipe data nilai disimpan dalam stack sedangkan tipe data referensi disimpan dalam heap. Keuntungan disimpan dalam stack adalah performanya yang jauh lebih cepat dari tipe data yang disimpan dalam heap.
Enum Enum digunakan untuk membuat sebuah enumerasi. Enumerasi adalah tipe data yang berisi kumpulan konstanta. Enum banyak digunakan pada kumpulan set nilai/konstanta yang memiliki ruang lingkup tertentu (contoh: nama hari, nama bulan, dan status pernikahan).
us i ng Sys t em; names pace EnumDemo { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Cons ol e. Wr i t e( "Mas ukan nomor har i ( 0- 6) : ") ; s t r i ng noHar i St r = Cons ol e. ReadLi ne( ) ; // Conver t t o i nt i nt noHar i ; i nt . Tr yPar s e( noHar i St r , out noHar i ) ; // Conver t t o NamaHar i NamaHar i har i = ( NamaHar i ) noHar i ; Cons ol e. Wr i t eLi ne( har i ) ;
}
}
}
// Has i l : // Mas ukan nomor har i ( 0- 6) : 5 // Sabt u
publ i c enum NamaHar i { Seni n, Sel as a, Rabu, Kami s , J umat , Sabt u, Mi nggu }
Abstract dan Interface Sebuah kelas bilamana hanya berdiri sendiri tidak dapat menyelesaikan banyak masalah. Tetapi bilamana kelas tersebut dibuat berkolaborasi satu dengan yang lainnya, maka dapat digunakan untuk menyelesaikan banyak masalah. Bab ini akan membahas salah satu relasi antar kelas, yaitu pewarisan (inheritance). Pada bab ini akan dibahas juga overloading, member hiding, dan overriding, beserta perbedaan antara ketiganya.
Inheritance Pewarisan (inheritance) adalah ketika sebuah kelas dibuat berdasarkan kelas lainnya. Dengan menggunakan pewarisan maka secara otomatis semua anggota kelas induk akan turun ke kelas anak. Sehingga kelas anak memiliki fitur sama atau lebih baik dari kelas induk. Pada bahasa pemrograman C#, sebuah kelas hanya dapat mewarisi anggota kelas dari satu buah kelas lainnya saja (single inheritance).
Ketika sebuah kelas dibuat dengan pewarisan, maka kedua kelas tersebut memiliki semantik "is a" atau "adalah". Contoh bilamana kelas motor dibuat dari pewarisan kelas kendaraan, maka dapat dikatakan bahwa motor adalah kendaraan. Perlu diingat, walaupun tidak ada yang dapat mencegah sebuah pengembang untuk melakukan pewarisan tanpa semantik, sangat disarankan semantik dari pewarisan perlu dipertahankan untuk memudahkan dalam pengembangan lebih lanjut.
us i ng Sys t em; names pace I nher i t ance { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Empl oyee e = new Empl oyee( ) ; e. Name = "J ames Bond" ; e. Pas s wor d = "Agent 007" ; e. Sal ar y = 1000000; Cons ol e. Wr i t eLi ne( e. Name) ; Cons ol e. Wr i t eLi ne( e. Pas s wor d) ; Cons ol e. Wr i t eLi ne( "{ 0: #, 0. 00} " , e. Sal ar y) ;
}
}
// // // //
Has i l : J ames Bond Agent 007 1, 000, 000. 00
publ i c cl as s Us er { pr i vat e s t r i ng name; pr i vat e s t r i ng pas s wor d; publ i c s t r i ng Name { get { r et ur n name; } s et { name = val ue; } }
}
publ i c s t r i ng Pas s wor d { get { r et ur n pas s wor d; } s et { pas s wor d = val ue; } }
publ i c cl as s Empl oyee : Us er { pr i vat e deci mal s al ar y;
}
}
publ i c deci mal Sal ar y { get { r et ur n s al ar y; } s et { s al ar y = val ue; } }
Override Ketika melakukan pewarisan, maka secara otomatis anggota kelas milik kelas induk turun ke kelas anak. Bilamana ternyata implementasi dari kelas induk tersebut tidak sesuai dengan kebutuhan kelas anak, maka (tergantung bagaimana implementasi
anggota kelas tersebut di kelas induk) dapat ditimpa (override) dengan implementasi baru. us i ng Sys t em; names pace Over r i de { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Buj ur Sangkar bs = new Buj ur Sangkar ( ) ; bs . Si s i = 4; Cons ol e. Wr i t eLi ne( bs ) ;
}
}
// Has i l : // 4. 00 x 4. 00 = 16. 00
publ i c cl as s Bi dangDat ar { publ i c vi r t ual doubl e Hi t ungLuas ( ) { r et ur n - 1; }
}
publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "{ 0: #, 0. 00} " , t hi s . Hi t ungLuas ( ) ) ; }
publ i c cl as s Buj ur Sangkar : Bi dangDat ar { pr i vat e doubl e s i s i ; publ i c doubl e Si s i { get { r et ur n s i s i ; } s et { s i s i = val ue; } } publ i c over r i de doubl e Hi t ungLuas ( ) { r et ur n ( Si s i * Si s i ) ; }
}
}
publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "{ 0: #, 0. 00} x { 0: #, 0. 00} = { 1: #, 0. 00} " , Si s i , Hi t ungLuas ( ) ) ; }
Hiding, Overloading, dan Overriding
Hiding, overloading, dan overriding adalah efek sampingan proses pewarisan. Hal ini terjadi ketika membuat sebuah anggota kelas baru di kelas anak, yang memiliki nama (dan pola) yang sama dengan kelas induk. Tergantung kebutuhan, efek dari ketiganya dapat dipergunakan oleh pihak pengembang untuk menyelesaikan berbagai macam kasus. us i ng Sys t em; names pace Hi di ng { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Par ent p = new Par ent ( ) ; Chi l d c = new Chi l d( ) ; Cons ol e. Wr i t eLi ne( "Par ent . Foo( ) = " + p. Foo( ) ) ; Cons ol e. Wr i t eLi ne( "Chi l d. Foo( ) = " + c. Foo( ) ) ; Par ent cp = c as Par ent ; Cons ol e. Wr i t eLi ne( "( Chi l d as Par ent ) . Foo( ) = " + cp. Foo( ) ) ; Cons ol e. Wr i t eLi ne( ) ; Cons ol e. Wr i t eLi ne( "p Cons ol e. Wr i t eLi ne( "p Cons ol e. Wr i t eLi ne( "c Cons ol e. Wr i t eLi ne( "c
}
}
// // // // // // // // //
is is is is
a a a a
Chi l d? " + ( p i s Chi l d) ) ; Par ent ? " + ( p i s Par ent ) ) ; Chi l d? " + ( c i s Chi l d) ) ; Par ent ? " + ( c i s Par ent ) ) ;
Has i l : Par ent . Foo( ) = 1 Chi l d. Foo( ) = 2 ( Chi l d as Par ent ) . Foo( ) = 1 p p c c
is is is is
a a a a
Chi l d? Fal s e Par ent ? Tr ue Chi l d? Tr ue Par ent ? Tr ue
publ i c cl as s Par ent { publ i c doubl e Foo( ) { r et ur n 1; } }
}
publ i c cl as s Chi l d : Par ent { publ i c new doubl e Foo( ) { r et ur n 2; } }
Hiding adalah proses penyembunyian anggota kelas induk, karena kelas anak telah memiliki anggota kelas dengan nama dan pola yang sama dengan kelas induk. Pada
bahasa pemrograman C#, hal ini dapat dilakukan dengan menggunakan kata kunci new yang disertakan di depan nama anggota kelas yang dimaksud. Overloading (sama dengan definisi sebelumnya) mungkin terjadi apabila dalam sebuah kelas terdapat dua buah method dengan nama sama tetapi memiliki pola yang berbeda. Saat sebuah kelas dihasilkan menggunakan pewarisan, maka sangat besar kemungkinan kelas anak dapat method dengan nama sama tetapi memiliki pola yang berbeda. us i ng Sys t em; names pace Over r i di ng { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Par ent p = new Par ent ( ) ; Chi l d c = new Chi l d( ) ; Cons ol e. Wr i t eLi ne( "Par ent . Foo( ) = " + p. Foo( ) ) ; Cons ol e. Wr i t eLi ne( "Chi l d. Foo( ) = " + c. Foo( ) ) ; Par ent cp = c as Par ent ; Cons ol e. Wr i t eLi ne( "( Chi l d as Par ent ) . Foo( ) = " + cp. Foo( ) ) ; Cons ol e. Wr i t eLi ne( ) ; Cons ol e. Wr i t eLi ne( "p Cons ol e. Wr i t eLi ne( "p Cons ol e. Wr i t eLi ne( "c Cons ol e. Wr i t eLi ne( "c
}
}
// // // // // // // // //
is is is is
Chi l d? " + ( p i s Chi l d) ) ; Par ent ? " + ( p i s Par ent ) ) ; Chi l d? " + ( c i s Chi l d) ) ; Par ent ? " + ( c i s Par ent ) ) ;
Has i l : Par ent . Foo( ) = 1 Chi l d. Foo( ) = 2 ( Chi l d as Par ent ) . Foo( ) = 2 p p c c
is is is is
a a a a
Chi l d? Fal s e Par ent ? Tr ue Chi l d? Tr ue Par ent ? Tr ue
publ i c cl as s Par ent { publ i c vi r t ual doubl e Foo( ) { r et ur n 1; } }
}
a a a a
publ i c cl as s Chi l d : Par ent { publ i c over r i de doubl e Foo( ) { r et ur n 2; } }
Overriding dapat terjadi bilamana: (1) Kelas induk memperbolehkan anggota kelasnya untuk ditimpa implementasinya, dengan menambahkan kata kunci virtual di depan anggota kelas induk yang dimaksud. (2) Kelas anak membuat sebuah anggota kelas yang memiliki pola yang sama dengan anggota kelas induk dan menambahkan kata kunci override di depan anggota kelas anak.
Sealed Berbeda dengan kata kunci virtual yang membiarkan pengembang untuk override anggota kelas yang telah didefinisikan sebelumnya. Kata kunci sealed digunakan untuk mencegah anggota kelas untuk ditimpa lebih lanjut (memotong rantai override). Selain dapat digunakan pada anggota kelas (method/property), kata kunci ini juga dapat digunakan pada level kelas. Bilamana digunakan pada level kelas, maka kelas tersebut adalah final, tidak dapat diturunkan. names pace Seal ed { publ i c cl as s A { publ i c vi r t ual voi d Foo( ) { } } publ i c cl as s B : A { publ i c s eal ed over r i de voi d Foo( ) { } } publ i c s eal ed cl as s C : B { // ERROR: Ti dak dapat meni mpa s eal ed member // publ i c over r i de voi d Foo( ) { } // Hanya di mungki nkan membuat member bar u publ i c new voi d Foo( ) { } }
}
// Ti dak dapat i nher i t s eal ed cl as s // publ i c cl as s D : C { }
Abstract Class Kelas abstrak adalah kelas yang tidak dapat dibuat instans (objek) nya. Kelas abstrak digunakan sebagai pola untuk membuat kelas lainnya. Kelas ini biasanya berisi kumpulan method/property abstrak yang harus dibuat oleh kelas anak. Method/property abstrak tidak memiliki implementasi (kode program), tugas dari kelas yang diwarisi method/property ini yang harus membuat kode program.
names pace Abs t r act Cl as s { publ i c abs t r act cl as s Bi dangDat ar { publ i c abs t r act doubl e Luas { get ; } } publ i c cl as s Segi t i ga : Bi dangDat ar { pr i vat e doubl e al as ; pr i vat e doubl e t i nggi ; publ i c doubl e Al as { get { r et ur n al as ; } s et { al as = val ue; } } publ i c doubl e Ti nggi { get { r et ur n t i nggi ; } s et { t i nggi = val ue; } }
}
publ i c over r i de doubl e Luas { get { r et ur n ( 0. 5 * al as * t i nggi ) ; } }
publ i c cl as s Buj ur Sangkar : Bi dangDat ar { pr i vat e doubl e s i s i ; publ i c doubl e Si s i { get { r et ur n s i s i ; } s et { s i s i = val ue; } }
}
}
publ i c over r i de doubl e Luas { get { r et ur n ( s i s i * s i s i ) ; } }
Kelas abstrak dan interface banyak digunakan pada pola desain perangkat lunak karena sifatnya yang mampu "memaksa" pengembang untuk implementasi method/ property sesuai dengan pola yang telah ditentukan sebelumnya. Dengan menggunakan kelas abstrak dan interface, maka objek lain dapat memanggil objek lainnya hanya lewat antarmukanya saja, tanpa peduli objek mana yang melakukan operasi tersebut.
us i ng Sys t em; names pace Abs t r act Cl as s { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Segi t i ga s 3 = new Segi t i ga( ) ; s 3. Al as = 4; s 3. Ti nggi = 5; Buj ur Sangkar bs = new Buj ur Sangkar ( ) ; bs . Si s i = 4; Cet akLuas ( s 3) ; Cet akLuas ( bs ) ;
}
}
}
// Has i l : // 10. 00 // 16. 00
s t at i c voi d Cet akLuas ( Bi dangDat ar obj ) { Cons ol e. Wr i t eLi ne( "{ 0: #, 0. 00} ", obj . Luas ) ; }
Interface Interface memiliki tujuan yang serupa dengan kelas abstrak. Perbedaan paling mencolok antara keduanya adalah: kelas abstrak (1) dapat memiliki field dan (2) dapat memiliki anggota non-abstrak, sedangkan pada interface hanya dapat memiliki anggota (method/property) abstrak saja.
names pace I nt er f ace { publ i c i nt er f ace I Kel i l i ng { doubl e Kel i l i ng { get ; } } publ i c abs t r act cl as s Bi dangDat ar { publ i c abs t r act doubl e Luas { get ; } } publ i c cl as s Segi t i ga : Bi dangDat ar { pr i vat e doubl e al as ; pr i vat e doubl e t i nggi ; publ i c doubl e Al as { get { r et ur n al as ; } s et { al as = val ue; } } publ i c doubl e Ti nggi { get { r et ur n t i nggi ; } s et { t i nggi = val ue; } }
}
publ i c over r i de doubl e Luas { get { r et ur n ( 0. 5 * al as * t i nggi ) ; } }
publ i c cl as s Buj ur Sangkar : Bi dangDat ar , I Kel i l i ng { pr i vat e doubl e s i s i ; publ i c doubl e Si s i { get { r et ur n s i s i ; } s et { s i s i = val ue; } } publ i c over r i de doubl e Luas { get { r et ur n ( s i s i * s i s i ) ; } }
}
}
publ i c doubl e Kel i l i ng { get { r et ur n ( 4 * s i s i ) ; } }
Kode program, menggunakan kasus yang sama dengan ketika mendemonstrasikan kelas abstrak. Perbedaannya kali ini ditambahkan sebuah interface untuk menghitung keliling. Kelas BujurSangkar implement interface IKeliling. Pada kelas
Program juga dibuat sedikit perbaikan pada bagian method Cetak untuk akomodir kemungkinan kelas implement IKeliling. us i ng Sys t em; names pace I nt er f ace { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Buj ur Sangkar bs = new Buj ur Sangkar ( ) ; bs . Si s i = 3; Cet ak( bs ) ;
}
// Has i l : // Luas = 9. 00 // Kel i l i ng = 12. 00
s t at i c voi d Cet ak( Bi dangDat ar obj ) { Cons ol e. Wr i t eLi ne( "Luas = { 0: #, 0. 00} ", obj . Luas ) ;
}
}
}
i f ( obj i s I Kel i l i ng) { var t mp = obj as I Kel i l i ng; Cons ol e. Wr i t eLi ne( "Kel i l i ng = { 0: #, 0. 00} " , t mp. Kel i l i ng) ; }
Keuntungan dalam menggunakan interface adalah sebuah kelas/struct dapat implement lebih dari satu interface. Berbeda dengan kelas yang memiliki semantik "is a" atau "adalah", interface tidak memiliki semantik khusus sehingga lebih leluasa untuk digunakan.
us i ng Sys t em; names pace Mul t i pl eI nt er f ace { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { DoAct i ons ( new Duck( ) ) ; DoAct i ons ( new Seagul l ( ) ) ;
}
// // // // //
Has i l : Duck s wi mmi ng Seagul l s wi mmi ng Seagul l f l yi ng
s t at i c voi d DoAct i ons ( Bi r d bi r d) { i f ( bi r d i s I Swi m) { var ent i t y = bi r d as I Swi m; ent i t y. Swi m( ) ; } i f ( bi r d i s I Fl y) { var ent i t y = bi r d as I Fl y; ent i t y. Fl y( ) ; }
}
}
Cons ol e. Wr i t eLi ne( ) ;
publ i c i nt er f ace I Fl y { voi d Fl y( ) ; } publ i c i nt er f ace I Swi m { voi d Swi m( ) ; } publ i c abs t r act cl as s Bi r d { // Met hods and Pr oper t i es } publ i c cl as s Duck : Bi r d, I Swi m { publ i c voi d Swi m( ) { Cons ol e. Wr i t eLi ne( "Duck s wi mmi ng" ) ; } } publ i c cl as s Seagul l : Bi r d, I Swi m, I Fl y { publ i c voi d Fl y( ) { Cons ol e. Wr i t eLi ne( "Seagul l f l yi ng" ) ; } publ i c voi d Swi m( ) { Cons ol e. Wr i t eLi ne( "Seagul l s wi mmi ng") ;
publ i c cl as s Seagul l : Bi r d, I Swi m, I Fl y { publ i c voi d Fl y( ) { Cons ol e. Wr i t eLi ne( "Seagul l f l yi ng" ) ; }
}
}
publ i c voi d Swi m( ) { Cons ol e. Wr i t eLi ne( "Seagul l s wi mmi ng") ; }
Class Library Salah satu tujuan dari paradigma pemrograman berorentasi objek adalah penggunaan kode berulang. Bahasa pemrograman C# menyediakan banyak fasilitas untuk melakukan hal ini. Salah satunya adalah dengan membuat class library (pustaka kelas). Sub bab ini akan membahas langkah-langkah yang perlu dilakukan untuk membuat class library.
1. Buat sebuah Proyek Class Library, beri nama "MyFirstClassLibrary".
2. Delete file Class1.cs dan tambahkan sebuah kelas baru bernama Vector.
3. Buat kode program untuk Vector.
us i ng Sys t em; names pace MyFi r s t Cl as s Li br ar y { publ i c s t r uct Vect or { pr i vat e doubl e x; pr i vat e doubl e y; publ i c doubl e X { get { r et ur n x; } s et { x = val ue; } } publ i c doubl e Y { get { r et ur n y; } s et { y = val ue; } } publ i c doubl e Lengt h { get { r et ur n Mat h. Sqr t ( X * X + Y * Y) ; } } publ i c voi d Set XY( doubl e x, doubl e y) { X = x; Y = y; } publ i c s t at i c Vect or oper at or + ( Vect or v1, Vect or v2) { r et ur n new Vect or ( ) { X = ( v1. X + v2. X) , Y = ( v1. Y + v2. Y) } ; } publ i c s t at i c Vect or oper at or - ( Vect or v1, Vect or v2) { r et ur n new Vect or ( ) { X = ( v1. X - v2. X) , Y = ( v1. Y - v2. Y) } ; } publ i c s t at i c Vect or oper at or * ( Vect or v, doubl e m) { r et ur n new Vect or ( ) { X = ( v. X * m) , Y = ( v. Y * m) } ; }
}
}
publ i c s t at i c Vect or oper at or / ( Vect or v, doubl e m) { r et ur n new Vect or ( ) { X = ( v. X / m) , Y = ( v. Y / m) } ; }
4. Compile, berkas MyFirstClassLibrary.dll siap digunakan. Langkah selanjutnya adalah menggunakan library yang sudah dibuat. Buat sebuah proyek konsol baru, beri nama TestClassLibrary.
5. Tambahkan file .dll ke dalam referensi dari proyek. Klik kanan References pada window Solution Explorer, lalu pilih Add Reference...
6. Pilih Browse dan buka folder bin dari proyek sebelumnya (MyFirstClassLibrary), pilih berkas MyFirstClassLibrary.dll. Bilamana pada tahap ini tidak ditemukan berkas .dll, berarti proyek sebelumnya belum dikompilasi (buka proyek lama dengan menggunakan Visual Studio dan lakukan kompilasi sebelum melanjutkan). Klik Ok untuk menutup window Add Reference.
7. Pada berkas Program.cs, tambahkan using MyFirstClassLibrary lalu ketikan kode program berikut. Jalankan kode program untuk melihat hasil keluaran program. us i ng Sys t em; us i ng MyFi r s t Cl as s Li br ar y; names pace Tes t Cl as s Li br ar y { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Vect or v1 = new Vect or ( ) { X = 4, Y = 5 } ; Vect or v2 = new Vect or ( ) { X = 3, Y = 3 } ; Vect or v = v1 + v2; Cons ol e. Wr i t eLi ne( "( { 0} , { 1} ) " , v. X, v. Y) ;
}
}
}
// Has i l : // ( 7, 8)
Struktur Data Generik Struktur data generik didukung oleh bahasa pemrograman C# semenjak versi 2.0 yang resmi diluncurkan pada bulan September 2005 bersamaan dengan diluncurkannya Visual Studio 2005. Struktur data generik memungkinkan sebuah struktur data untuk digunakan sesuai dengan tipe data tujuan. Dibandingkan menggunakan struktur data ArrayList yang mampu menyimpan sembarang tipe, jauh lebih mudah dan memiliki performa lebih baik bilamana menggunakan struktur data List yang memiliki fungsionalitas sama, tetapi hanya diperuntukan untuk satu tipe data saja (T).
List Kelas List adalah struktur data generik yang memodelkan sebuah list. List adalah sebuah struktur data yang serupa dengan Array (larik). Perbedaannya adalah pada list jumlah elemen tidak ditentukan di awal, dapat bertambah/berkurang sesuai kebutuhan pada saat program berjalan (runtime). List memiliki beberapa operasi standar, seperti tambah elemen (Add), sisip elemen (Insert), hapus sebuah elemen (Remove/RemoveAt), dan hapus seluruh elemen (Clear). us i ng Sys t em; us i ng Sys t em. Col l ect i ons . Gener i c; us i ng Sys t em. Li nq; names pace Li s t Demo { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Li s t number s = new Li s t ( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nTambah beber apa el ement " ) ; number s . Add( 1) ; number s . Add( 9) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nSi s i p beber apa el ement " ) ; number s . I ns er t ( 0, 7) ; number s . I ns er t ( 0, 8) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nHapus el emen t er t ent u" ) ; number s . Remove( 1) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nHapus el emen pada i ndeks t er t ent u") ; number s . RemoveAt ( 0) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nHapus s emua el emen" ) ; number s . Cl ear ( ) ; Pr i nt Col l ect i on( number s ) ;
}
}
}
// // // // // // // // // // // // // // // // // // // // // // //
Hasi l : Banyak el emen: 0 El ement s : <none> Tambah beber apa el emen Banyak el emen: 2 El ement s : 1, 9 Si si p beber apa el emen Banyak el emen: 4 El ement s : 8, 7, 1, 9 Hapus el emen t er t ent u Banyak el emen: 3 El ement s : 8, 7, 9 Hapus el emen pada i ndeks t er t ent u Banyak el emen: 2 El ement s : 7, 9 Hapus s emua el emen Banyak el emen: 0 El ement s : <none>
s t at i c voi d Pr i nt Col l ect i on( I Enumer abl e obj s ) { Cons ol e. Wr i t eLi ne( "Banyak el emen: " + obj s . Count ( ) ) ; Cons ol e. Wr i t eLi ne( "El ement s : " + ( obj s . Count ( ) == 0 ? " <none>" : s t r i ng. J oi n( ", ", obj s ) ) ) ; }
Stack Kelas Stack adalah struktur data generik yang memodelkan sebuah tumpukan. Struktur data ini memiliki karakteristik LIFO (Last In First Out), mirip dengan tumpukan kartu (kartu yang terakhir masuk, adalah kartu yang pertama keluar). Kelas stack memiliki dua buah operasi standar, tambah elemen (Push) dan ambil elemen (Pop). Selain itu ada juga operasi tambahan untuk melihat elemen berikutnya tanpa diambil dari tumpukan (Peek). us i ng Sys t em; us i ng Sys t em. Col l ect i ons . Gener i c; us i ng Sys t em. Li nq; names pace St ackDemo { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { St ack number s = new St ack( ) ; Pr i nt Col l ect i on( number s ) ;
Consol e. Wr i t eLi ne( "\nPus h beber apa el emen") ; number s . Pus h( 1) ; number s . Pus h( 9) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nLi hat el emen ber i kut " ) ; i nt peek = number s . Peek( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "Ni l ai el emen ber i kut : " + peek) ; Cons ol e. Wr i t eLi ne( "\nPop el emen ber i kut ") ; i nt pop = number s . Pop( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "Ni l ai el emen di kel uar kan: " + pop) ;
}
}
}
// // // // // // // // // // // // // // // // //
Hasi l : Banyak el emen: 0 El ement s : <none> Push beber apa el emen Banyak el emen: 2 El ement s : 9, 1 Li hat el emen ber i kut Banyak el emen: 2 El ement s : 9, 1 Ni l ai el emen ber i kut : 9 Pop el emen ber i kut Banyak el emen: 1 El ement s : 1 Ni l ai el emen di kel uar kan: 9
s t at i c voi d Pr i nt Col l ect i on( I Enumer abl e obj s ) { Cons ol e. Wr i t eLi ne( "Banyak el emen: " + obj s . Count ( ) ) ; Cons ol e. Wr i t eLi ne( "El ement s : " + ( obj s . Count ( ) == 0 ? " <none>" : s t r i ng. J oi n( ", ", obj s ) ) ) ; }
Queue Kelas Queue adalah struktur data generik yang memodelkan sebuah antrian. Berbeda dengan stack, struktur data queue memiliki karakteristik FIFO (First In First Out), mirip dengan antrian (orang yang mengantri pertama akan dilayani pertama). Kelas queue memiliki dua buah operasi standar, tambah antrian (Enqueue) dan keluar dari antrian (Dequeue). Selain itu (sama dengan kelas stack), kelas queue memiliki juga operasi tambahan untuk mengintip nilai berikutnya tanpa harus keluar dari antrian (Peek).
us i ng Sys t em; us i ng Sys t em. Col l ect i ons . Gener i c; us i ng Sys t em. Li nq; names pace QueueDemo { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Queue number s = new Queue( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nSi mpan el emen dal am bar i s an" ) ; number s . Enqueue( 1) ; number s . Enqueue( 9) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "\nLi hat el emen ber i kut " ) ; i nt peek = number s . Peek( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "Ni l ai el emen ber i kut : " + peek) ; Cons ol e. Wr i t eLi ne( "\nKel uar kan el emen dar i bar i s an" ) ; i nt pop = number s . Dequeue( ) ; Pr i nt Col l ect i on( number s ) ; Cons ol e. Wr i t eLi ne( "El emen yang kel uar dar i bar i s an: " + pop) ;
}
}
}
// // // // // // // // // // // // // // // // //
Hasi l : Banyak el emen: 0 El ement s : <none> Si mpan el emen dal am bar i s an Banyak el emen: 2 El ement s : 1, 9 Li hat el emen ber i kut Banyak el emen: 2 El ement s : 1, 9 Ni l ai el emen ber i kut : 1 Kel uar kan el emen dar i bar i san Banyak el emen: 1 El ement s : 9 El emen yang kel uar dar i bar i s an: 1
s t at i c voi d Pr i nt Col l ect i on( I Enumer abl e obj s ) { Cons ol e. Wr i t eLi ne( "Banyak el emen: " + obj s . Count ( ) ) ; Cons ol e. Wr i t eLi ne( "El ement s : " + ( obj s . Count ( ) == 0 ? " <none>" : s t r i ng. J oi n( ", ", obj s ) ) ) ; }
Dictionary
Sesuai dengan namanya dictionary (kamus) adalah sebuah struktur data yang terdiri dari kumpulan kunci dan nilai. Pada struktur data dictionary sebuah kunci merujuk ke sebuah nilai. Dictionary memiliki beberapa operasi, yaitu: • Add untuk menambah elemen (key dan nilai). • Remove untuk menghapus salah satu elemen dengan key tertentu. • Clear untuk menghapus semua elemen. • ContainsKey/ContainsValue untuk melakukan pengecekan apakah sebuah key/value ada dalam dictionary. us i ng Sys t em; us i ng Sys t em. Col l ect i ons . Gener i c; names pace Di ct i onar yDemo { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Di ct i onar y<s t r i ng, s t r i ng> di ct = new Di ct i onar y<s t r i ng, st r i ng>( ) ; Cons ol e. Wr i t eLi ne( "J uml ah el emen ( awal ) : " + di ct . Count ) ; di ct . Add( "s eni n", "monday" ) ; di ct . Add( "s el asa", "t ues day") ; Cons ol e. Wr i t eLi ne( "\nTambah beber apa el emen") ; Cons ol e. Wr i t eLi ne( "J uml ah el emen: " + di ct . Count ) ; Cons ol e. Wr i t eLi ne( "El ement s : ") ; f or each ( KeyVal uePai r <s t r i ng, s t r i ng> i t em i n di ct ) Cons ol e. Wr i t eLi ne( "Key: { 0} , Val ue: { 1} " , i t em. Key, i t em. Val ue) ; Cons ol e. Wr i t eLi ne( "\nKeys : " ) ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", di ct . Keys ) ) ; Cons ol e. Wr i t eLi ne( "\nVal ues : ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", di ct . Val ues ) ) ; di ct . Remove( "s el as a") ; Cons ol e. Wr i t eLi ne( "\nHapus s ebuah el emen" ) ; Cons ol e. Wr i t eLi ne( "J uml ah el emen: " + di ct . Count ) ; Cons ol e. Wr i t eLi ne( "El ement s : ") ; f or each ( KeyVal uePai r <s t r i ng, s t r i ng> i t em i n di ct ) Cons ol e. Wr i t eLi ne( "Key: { 0} , Val ue: { 1} " , i t em. Key, i t em. Val ue) ;
}
}
}
// // // // // // // // // // // // // // // // // // //
Hasi l : J uml ah el emen ( awal ) : 0 Tambah beber apa el emen J uml ah el emen: 2 El ement s : Key: s eni n, Val ue: monday Key: s el as a, Val ue: t ues day Keys : s eni n, s el as a Val ues : monday, t ues day Hapus s ebuah el emen J uml ah el emen: 1 El ement s : Key: s eni n, Val ue: monday
Languange Integrated Query (LINQ) Language integrated query (LINQ) atau (dalam bahasa indonesia) bahasa kueri terintegrasi adalah salah satu fitur andalan yang dimiliki oleh bahasa pemrograman C# yang bertujuan untuk memudahkan melakukan kueri. Berbeda dengan SQL (Structured Query Language) yang dirancang untuk melakukan kueri ke basis data, LINQ dirancang sebagai bahasa kueri universal yang dapat digunakan tidak hanya ke basis data, tetapi dapat digunakan juga untuk melakukan kueri objek dan XML. Framework LINQ memungkinkan pengembang untuk mengembangkan kueri ini sehingga dapat digunakan ke media lain. Sampai buku ini dituliskan, telah banyak pengembangan LINQ ke ranah lain (contoh: Twitter dan Facebook).
Kueri Umum LINQ menyediakan beberapa kata kunci tambahan yang dapat digunakan untuk melakukan kueri. Kata kunci from-in-select merupakan kombinasi kata kunci yang digunakan untuk seleksi semua data yang ada pada kumpulan data. Contoh bilamana terdapat sebuah kumpulan nilai bertipe data string dengan nama names, maka pernyataan from name in names select name ekivalen dengan names itu sendiri (karena melakukan seleksi semua nilai yang ada pada kumpulan). us i ng Sys t em; us i ng Sys t em. Li nq; names pace Kuer i { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { s t r i ng[ ] names = { "Andi ", "Budi ", "Ci t r a", "Dondy", "Bel l a", "Agus ", "Di ana", "Lukas ", "Li ana" } ; Cons ol e. Wr i t eLi ne( "Or i gi nal ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", names ) + "\n") ; var quer y = f r om i t em i n names s el ect i t em; Cons ol e. Wr i t eLi ne( "Af t er Quer y") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", quer y) ) ;
}
}
}
// // // // //
Hasi l : Or i gi nal Andi , Budi , Ci t r a, Dondy, Bel l a, Agus, Di ana, Lukas , Li ana Af t er Quer y Andi , Budi , Ci t r a, Dondy, Bel l a, Agus, Di ana, Lukas , Li ana
Perlu diingat bahwa name pada kueri tersebut adalah sebuah variabel yang tipe datanya tergantung dari kumpulan nilai. Pada kasus names, maka name bertipe data string.
Filter Data Kata kunci yang digunakan untuk melakukan filtrasi data pada LINQ adalah kata kunci where. Kata kunci ini disisipkan sebelum select. Contoh pada kasus names yang telah dipaparkan sebelumnya, bilamana ingin kueri nilai yang diawali karakter 'a', maka dapat menggunakan pernyataan from name in names where name.StartsWith("a") select name. us i ng Sys t em; us i ng Sys t em. Li nq; names pace Fi l t er Dat aSi mpl e { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { s t r i ng[ ] names = { "Andi ", "Budi ", "Ci t r a", "Dondy", "Bel l a", "Agus ", "Di ana", "Lukas ", "Li ana" } ; Cons ol e. Wr i t eLi ne( "Or i gi nal ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", names ) + "\n") ; var quer y = f r om i t em i n names wher e i t em. ToLower ( ) . St ar t s Wi t h( "a") s el ect i t em; Cons ol e. Wr i t eLi ne( "Af t er Quer y") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", quer y) ) ;
}
}
}
// // // // //
Hasi l : Or i gi nal Andi , Budi , Ci t r a, Dondy, Bel l a, Agus, Di ana, Lukas , Li ana Af t er Quer y Andi , Agus
Kata kunci where diikuti dengan sebuah pernyataan boolean (dapat dievaluasi menjadi nilai true/false). Pernyataan boolean pada LINQ dapat berupa pernyataan boolean sederhanya (evaluasi satu buah pernyataan boolean) atau dapat juga berupa komposit (gabungan dari beberapa buah pernyataan boolean).
us i ng Sys t em; us i ng Sys t em. Li nq; names pace Fi l t er Dat a { cl as s Per s on { publ i c s t r i ng Name { get ; s et ; } publ i c i nt Age { get ; s et ; } publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "{ 0} ( { 1} ) ", Name, Age) ; } } cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Per s on[ ] per s ons = new Per s on[ ] { new Per s on { Name=" Andi ", Age=30 } , new Per s on { Name=" Budi ", Age=31 } , new Per s on { Name=" Li ana", Age=30 } , new Per s on { Name=" Agus ", Age=31 } , new Per s on { Name=" Anna", Age=31 } , new Per s on { Name=" Di ana", Age=30 } , new Per s on { Name=" J enni ", Age=31 } }; Cons ol e. Wr i t eLi ne( "Or i gi nal ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", per s ons. As Enumer abl e( ) ) + "\n" ) ; var quer y = f r om i t em i n per s ons wher e ( i t em. Name. ToLower ( ) . Cont ai ns ( "i ") ) && ( i t em. Age > 30) s el ect i t em; Cons ol e. Wr i t eLi ne( "Af t er Quer y") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", quer y) ) ;
}
}
}
// // // // //
Hasi l : Or i gi nal Andi ( 30) , Budi ( 31) , Li ana ( 30) , Agus ( 31) , Anna ( 31) , Di ana ( 30) . . . Af t er Quer y Budi ( 31) , J enni ( 31)
Sorting Data Melakukan pengurutan data pada LINQ, dapat dilakukan dengan menggunakan kata kunci orderby-ascending/descending. Aturan pengurutan data mengikuti aturan dari tipe data yang digunakan sebagai kunci. Contoh bilamana yang digunakan sebagai kunci bertipe data int, pengurutan ascending berarti dari 1 ke 9.
us i ng Sys t em; us i ng Sys t em. Li nq; names pace Sor t i ngDat a { cl as s Per s on { publ i c s t r i ng Name { get ; s et ; } publ i c i nt Age { get ; s et ; } publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "{ 0} ( { 1} ) ", Name, Age) ; } } cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Per s on[ ] per s ons = new Per s on[ ] { new Per s on { Name=" Andi ", Age=30 } , new Per s on { Name=" Budi ", Age=31 } , new Per s on { Name=" Li ana", Age=30 } , new Per s on { Name=" Agus ", Age=31 } , new Per s on { Name=" Anna", Age=31 } , new Per s on { Name=" Di ana", Age=30 } , new Per s on { Name=" J enni ", Age=31 } }; Cons ol e. Wr i t eLi ne( "Or i gi nal ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", per s ons. As Enumer abl e( ) ) + "\n" ) ; var quer y = f r om i t em i n per s ons wher e i t em. Name. ToLower ( ) . Cont ai ns( " i ") or der by i t em. Name des cendi ng s el ect i t em; Cons ol e. Wr i t eLi ne( "Af t er Quer y") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", quer y) ) ;
}
}
}
// // // // //
Hasi l : Or i gi nal Andi ( 30) , Budi ( 31) , Li ana ( 30) , Agus ( 31) , Anna ( 31) , Di ana ( 30) . . . Af t er Quer y Li ana ( 30) , J enni ( 31) , Di ana ( 30) , Budi ( 31) , Andi ( 30)
Proyeksi Data LINQ juga menyediakan fitur untuk melakukan proyeksi data. Proyeksi atau transformasi data banyak berguna bilamana dibutuhkan hasil dari sebuah kueri berupa kumpulan nilai yang memiliki tipe data berbeda atau penyatuan beberapa nilai.
us i ng Sys t em; us i ng Sys t em. Li nq; names pace Pr oyeks i Dat a { cl as s Per s on { publ i c s t r i ng Name { get ; s et ; } publ i c i nt Age { get ; s et ; } publ i c over r i de s t r i ng ToSt r i ng( ) { r et ur n s t r i ng. For mat ( "{ 0} ( { 1} ) ", Name, Age) ; } } cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Per s on[ ] per s ons = new Per s on[ ] { new Per s on { Name=" Andi ", Age=30 } , new Per s on { Name=" Budi ", Age=31 } , new Per s on { Name=" Li ana", Age=30 } , new Per s on { Name=" Agus ", Age=31 } , new Per s on { Name=" Anna", Age=31 } , new Per s on { Name=" Di ana", Age=30 } , new Per s on { Name=" J enni ", Age=31 } }; Cons ol e. Wr i t eLi ne( "Or i gi nal ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", per s ons. As Enumer abl e( ) ) + "\n" ) ; var quer y = f r om i t em i n per s ons wher e i t em. Name. ToLower ( ) . Ends Wi t h( " i ") s el ect s t r i ng. For mat ( "{ 0} - { 1} ", i t em. Age, i t em. Name) ; Cons ol e. Wr i t eLi ne( "Af t er Quer y") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( ", ", quer y) ) ;
}
}
}
// // // // //
Hasi l : Or i gi nal Andi ( 30) , Budi ( 31) , Li ana ( 30) , Agus ( 31) , Anna ( 31) , Di ana ( 30) . . . Af t er Quer y 30- Andi , 31- Budi , 31- J enni
Kode program sebelumnya merupakan contoh transformasi dan penyatuan dari dua buah nilai. Kumpulan tipe data Person yang terdiri dari tipe data string (Name) dan tipe data int (Age) ditransformasi menjadi kumpulan tipe data string dengan format tertentu.
Menggabungkan Data LINQ memungkinkan pengembang untuk menggabungkan dua buah (atau lebih) kumpulan data. Kumpulan data yang dihubungkan tidak harus memiliki relasi satu
dengan yang lainnya. Untuk menghubungkan data dapat digunakan beberapa cara, salah satu caranya adalah dengan menggunakan kata kunci join. names pace J oi nTanpaRel as i { cl as s Per s on { publ i c s t r i ng Name { get ; s et ; } publ i c i nt Age { get ; s et ; } }
}
cl as s Per s onAddr es s { publ i c s t r i ng Per s onName { get ; s et ; } publ i c s t r i ng Addr es s { get ; s et ; } }
Contoh berikut mendemonstrasikan cara menggabungkan dua buah kumpulan data tanpa relasi. Dalam kasus ini kelas Person memiliki dua buah property Name dan Age dan kelas PersonAddress memiliki dua buah property PersonName dan Address. Setelah operasi join diharapkan akan menghasilkan kumpulan data baru yang terdiri dari Name (Person), Age (Person), dan Address (PersonAddress).
us i ng Sys t em; us i ng Sys t em. Li nq; names pace J oi nTanpaRel as i { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Per s on[ ] per s ons = new Per s on[ ] { new Per s on { Name=" Ri s al ", Age=36 } , new Per s on { Name=" Raphael ", Age=23 } , new Per s on { Name=" Lea", Age=29 } }; Per s onAddr es s [ ] addr es s es = new Per s onAddr es s [ ] { new Per s onAddr es s { Per s onName="Lea", Addr es s ="Gg. Amung 12" } , new Per s onAddr es s { Per s onName="Ri s al ", Addr es s=" Sukahaj i 92" } , new Per s onAddr es s { Per s onName="Raphael " , Addr es s ="ABC 5" } , new Per s onAddr es s { Per s onName="Lea", Addr es s ="Sar i wangi 24" } }; var quer y = f r om per s on i n per s ons j oi n addr es s i n addr es ses on per s on. Name equal s addr es s . Per s onName s el ect new { Name = per s on. Name, Age = per s on. Age, Addr es s = addr es s . Addr es s }; // Konver s i ke kumpul an t eks var t ext s = f r om i t em i n quer y s el ect s t r i ng. For mat ( "{ 0} , { 1} , { 2} " , i t em. Name, i t em. Age, i t em. Addr es s ) ; Cons ol e. Wr i t eLi ne( "J oi n Res ul t ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( "\n", t ext s ) ) ;
}
}
}
// // // // // //
Hasi l : J oi n Res ul t Ri sal , 36, Sukahaj i 92 Raphael , 23, ABC 5 Lea, 29, Gg. Amung 12 Lea, 29, Sar i wangi 24
Selain menggunakan kata kunci join, penggembang juga dapat menggunakan fitur sub-kueri yang ada pada LINQ. Kode program berikut adalah pendekatan lain (contoh penggunaan sub-kueri) untuk menggabungkan dua buah kumpulan data.
us i ng Sys t em; us i ng Sys t em. Li nq; names pace SubKuer i { cl as s Pr ogr am { s t at i c voi d Mai n( s t r i ng[ ] ar gs ) { Per s on[ ] per s ons = new Per s on[ ] { new Per s on { Name=" Ri s al ", Age=36 } , new Per s on { Name=" Raphael ", Age=23 } , new Per s on { Name=" Lea", Age=29 } }; Per s onAddr es s [ ] addr es s es = new Per s onAddr es s [ ] { new Per s onAddr es s { Per s onName="Lea", Addr es s ="Gg. Amung 12" } , new Per s onAddr es s { Per s onName="Ri s al ", Addr es s=" Sukahaj i 92" } , new Per s onAddr es s { Per s onName="Raphael " , Addr es s ="ABC 5" } , new Per s onAddr es s { Per s onName="Lea", Addr es s ="Sar i wangi 24" } }; var quer y = f r om per s on i n per s ons f r om addr es s i n addr es ses wher e per s on. Name == addr es s . Per s onName s el ect new { Name = per s on. Name, Age = per s on. Age, Addr es s = addr es s . Addr es s }; // Konver s i ke kumpul an t eks var t ext s = f r om i t em i n quer y s el ect s t r i ng. For mat ( "{ 0} , { 1} , { 2} " , i t em. Name, i t em. Age, i t em. Addr es s ) ; Cons ol e. Wr i t eLi ne( "Sub- Quer y Res ul t ") ; Cons ol e. Wr i t eLi ne( s t r i ng. J oi n( "\n", t ext s ) ) ;
}
}
}
// // // // // //
Hasi l : Sub- Quer y Res ul t Ri sal , 36, Sukahaj i 92 Raphael , 23, ABC 5 Lea, 29, Gg. Amung 12 Lea, 29, Sar i wangi 24
Daftar Pustaka Allen, S. (2014, September 20). What's New in C# 6 . Retrieved from Pluralsight: http://www.pluralsight.com/courses/csharp-6-whats-new Michaelis, M. (2014, December). How C# 6.0 Simplifies, Clarifies and Condenses Your Code. Retrieved from Microsoft Developer Network (MSDN) Magazine: https://msdn.microsoft.com/en-us/magazine/dn879355.aspx Microsoft. (2014). Visual C#. Retrieved from Microsoft Developer Network (MSDN): https://msdn.microsoft.com/en-us/library/kx37x362.aspx Robinson, S. (2014, September 10). C# Equality and Comparisons. Retrieved from Pluralsight: http://www.pluralsight.com/courses/csharp-equality-comparisons Smet, B. D. (2014, January 29). C# Language Internals - Part 1. Retrieved from Pluralsight: http://www.pluralsight.com/courses/csharp-language-internals Smet, B. D. (2014, June 9). C# Language Internals - Part 2. Retrieved from Pluralsight: http://www.pluralsight.com/courses/csharp-language-internalspart2