Convert.ToInt32, int.Parse, dan int.TryParse dalam .NET

Posted by Ikhwan on August 28, 2007

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.

Comments

Leave a response

  1. ryzam Tue, 28 Aug 2007 10:20:08 MYT

    ya,..aku pun tak suka..guna arg yang ader out..rase tak elegent :)

  2. Livewire Tue, 28 Aug 2007 11:03:28 MYT

    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…

  3. Ikhwan Tue, 28 Aug 2007 11:31:56 MYT

    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..

  4. rohing Thu, 30 Aug 2007 09:55:43 MYT

    aku pon selalu pakai out gak..

Comments

*
To prove you're a person (not a spam script), type the security word shown in the picture. You can register to this site so you won't be asked to do this again. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word