Convert.ToInt32, int.Parse, dan int.TryParse dalam .NET
Dulu, kalau nak tukarkan string ke integer, aku akan gunakan Convert.ToInt32(). Operasi macam ni memang banyak dilakukan, contohnya seperti semasa nak proses input dari form dan sebagainya. Oleh sebab selalunya input ni adalah dari TextBox, yang boleh mengandungi apa-apa character, maka kita kena pastikan bahawa string yang dimasukkan oleh user adalah betul-betul boleh di-Convert ke integer.
Aku akan gunakan try..catch
int age = 0;
try
{
age = Convert.ToInt32(txtAge.Text);
}
catch
{
//R.I.P
}
if (age != 0)
person.Age = age;
else
MessageBox.Show("Invalid age!");
Operasi convert kat sini akan raise exception bila string yang dimasukkan tu gagal ditukar menjadi integer. Dalam catch kita tak buat apa-apa, cuma biarkan age dgn nilai asalnya.
Kemudian aku jumpa int.Parse(). Selain lebih pendek dan mudah ditaip, bezanya dgn Convert.ToInt32() ialah ia tidak akan raise NullArgumentException bila null string dimasukkan. Tapi cara aku validate sama ada ia boleh ditukar pada integer tu masih sama, gunakan try..catch jugak.
Using try..catch is expensive, dan hanya sepatutnya hanya digunakan utk betul-betul handle exception. Bukan seperti yang aku buat tu, utk validate input. Aku memang rasa tak sedap hati buat macam tu. Sehinggalah satu hari aku tersedar akan kewujudan int.TryParse(). Ia lebih ringkas dan mudah digunakan. Perhatikan,
int age = 0;
if (int.TryParse(txtAge.Text, out age))
person.Age = age;
else
MessageBox.Show("Invalid age!");
TryParse akan cuba tukarkan string ke integer. Jika tak berjaya dia akan return false. Jika berjaya, dia akan return true dan pada masa yang sama akan umpukkan nilai yang ditukarkan tadi kepada method argument yang kedua (iaitu age), yang ditandakan dgn keyword out.
Selalunya, aku tak berapa gemar utk gunakan keyword out ni, sebab IMO, one method should return one thing and one thing only. Kalau satu method pulangkan dua benda sekaligus, method ni akan kurang cohesive. Tapi tak apalah, untuk kes ni, kita tutup sebelah mata je lah ye ;)
Postscript
- Aku suka letak //R.I.P dalam catch yang tak buat apa-apa. Sebab catch mesti sentiasa handle exception yang di-raised. Jadi comment tu supaya aku nampak dan berhati-hati.
- int adalah shorthand utk Int32. Jadi int.TryParse() dan Int32.TryParse() adalah sama.
- TryParse juga wujud utk type lain seperti decimal.
Trackbacks
Trackbacks are closed.


ya,..aku pun tak suka..guna arg yang ader out..rase tak elegent :)
Dulu-dulu selalu guna Convert.To tapi sekarang dah guna .Parse. Tapi TryParse() tak pernah guna langsung…
Anyway, memula tau pasal out… abis semua method jadik void… then taruk out… tapi cam ryzam said lah… nampak tak elegant…
p/s: Akhirnya, ada new entry… selalu baca aje… first time comments…
Livewire: Selamat menjadi commenter baru :)
Bila a method returns multiple result, ni kira mcm code smell, menunjukkan code kita takde high cohesion. Tu je la. Tapi kadang mcm dlm kes ni, penggunaannya membolehkan code lebih ringkas dpt ditulis..
aku pon selalu pakai out gak..