Parse v. TryParse

111

Apa perbedaan antara Parse () dan TryParse ()?

int number = int.Parse(textBoxNumber.Text);

// The Try-Parse Method
int.TryParse(textBoxNumber.Text, out number);

Apakah ada bentuk pemeriksaan kesalahan seperti Coba-Catch Block?

Kredns
sumber

Jawaban:

155

Parsemelempar pengecualian jika tidak bisa mengurai nilai, sedangkan TryParsemengembalikan yang boolmenunjukkan apakah itu berhasil.

TryParsetidak hanya try/ secara catchinternal - intinya adalah bahwa itu diimplementasikan tanpa pengecualian sehingga cepat. Faktanya, cara penerapannya kemungkinan besar adalah bahwa secara internal Parsemetode akan memanggil TryParsedan kemudian mengeluarkan pengecualian jika kembali false.

Singkatnya, gunakan Parsejika Anda yakin nilainya akan valid; jika tidak gunakan TryParse.

Greg Beech
sumber
1
"secara internal metode Parse akan memanggil TryParse" Kecuali bahwa Parse telah melakukan pra-tanggal TryParse menurut beberapa versi. Tentu saja, mereka bisa saja memindahkan implementasi inti ke TryParse ...
Joel Coehoorn
4
@ Joel - Saya berasumsi mereka akan memindahkan implementasinya, tetapi saya baru saja melihat-lihat dengan reflektor dan mereka adalah implementasi terpisah dengan kode yang persis sama selain yang memiliki 'throw ...' dan satu memiliki 'return false'. Saya bertanya-tanya mengapa mereka tidak terkonsolidasi ?!
Greg Beech
6
Meskipun, memikirkannya, Parse melempar sejumlah pengecualian berbeda jadi jika yang dimilikinya hanyalah bool dari TryParse maka tidak akan tahu mana yang harus dilempar.
Greg Beech
5
"gunakan Parse jika Anda yakin nilainya akan valid". Saya akan menambahkan, "tetapi Anda mengakui kemungkinan Anda salah". Jika Anda 100% yakin dapat mengurai, Anda dapat menggunakan TryParse dengan benar yang mungkin lebih cepat.
Jon
2
Dan dengan "pengecualian berbeda", @GregBeech berarti pesannya, bukan kelasnya.
Paul Draper
26

Jika string tidak dapat diubah menjadi integer, maka

  • int.Parse() akan mengeluarkan pengecualian
  • int.TryParse() akan mengembalikan false (tetapi tidak membuat pengecualian)
M4N
sumber
Bagaimana jika saya menggunakan int.TryParse (some_method_that_throws_exception (), out int test)? Apakah itu akan menangkap pengecualian atau hanya yang terkait dengan penguraian?
Alexandru Antochi
@AlexandruAntochi Anda tidak boleh mengajukan pertanyaan sebagai komentar. Ini akan membuat hampir mustahil bagi orang lain untuk mendapatkan manfaat dari jawaban yang berguna. Namun, untuk membuatnya sepadan, jawaban untuk pertanyaan Anda adalah tidak, int.TryParse tidak akan melempar sama sekali. Jika metode gagal untuk mengurai, itu hanya akan mencerminkan ini dengan nilai kembalian false. Ini membuatnya nyaman untuk digunakan jika (int.TryParse… untuk hanya melakukan sesuatu jika penguraian berhasil.
Rob
3

Metode TryParse memungkinkan Anda menguji apakah ada sesuatu yang dapat diurai. Jika Anda mencoba Parse seperti pada contoh pertama dengan int yang tidak valid, Anda akan mendapatkan pengecualian saat berada di TryParse, ia mengembalikan boolean yang memberi tahu Anda apakah parse berhasil atau tidak.

Sebagai catatan kaki, meneruskan null ke sebagian besar metode TryParse akan memunculkan pengecualian.

Ray Booysen
sumber
Meneruskan null ke tipe dasar (int, double, DateTime, dll.) TIDAK akan menimbulkan pengecualian
Dr Yunke
3

TryParse dan Exception Tax

Parse melontarkan pengecualian jika konversi dari string ke jenis data yang ditentukan gagal, sedangkan TryParse secara eksplisit menghindari pelemparan pengecualian.

Gulzar Nazim
sumber
TryParse akan memunculkan pengecualian jika Anda meneruskan null untuk sebagian besar metode TryParse yang tidak terpisahkan.
Ray Booysen
1
Tautan bagus. Saya terkejut bahwa belum ada yang memulai diskusi "mana yang terbaik atau praktik pengkodean mana yang harus diterapkan".
Christian Madsen
0

TryParse tidak mengembalikan nilai, ia mengembalikan kode status untuk menunjukkan apakah parse berhasil (dan tidak memunculkan pengecualian).

Mark Brittingham
sumber
6
TryParse mengembalikan nilai melalui parameter dua yang ditentukan dengan kata kunci keluar.
Christian Madsen
0

Sebagai catatan, saya menguji dua kode: Itu hanya mencoba untuk mengubah dari string menjadi angka dan jika gagal maka tetapkan angka ke nol.

        if (!Int32.TryParse(txt,out tmpint)) {
            tmpint = 0;
        }

dan:

        try {
            tmpint = Convert.ToInt32(txt);
        } catch (Exception) {
            tmpint = 0;
        }

Untuk c #, opsi terbaik adalah menggunakan tryparse karena alternatif try & Catch mengeluarkan pengecualian

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll

Itu menyakitkan lambat dan tidak diinginkan, bagaimanapun, kode tidak berhenti kecuali pengecualian Debug diselesaikan untuk berhenti dengannya.

magallanes
sumber
Cuplikan kode pertama tidak melakukan apa-apa, karena tmpint akan disetel ke nol jika string tidak dapat diurai sebagai int.
Andrew Neely
0

Saya tahu ini posting yang sangat lama tetapi berpikir untuk membagikan beberapa detail lebih lanjut tentang Parse vs TryParse.

Saya punya skenario di mana DateTime perlu dikonversi ke String dan jika datevalue null atau string.empty kami menghadapi pengecualian. Untuk mengatasi ini, kami telah mengganti Parse dengan TryParse dan akan mendapatkan tanggal default.

Kode Lama:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy");
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy");

Kode Baru:

DateTime startDate = default(DateTime);
DateTime endDate=default(DateTime);
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate);
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate);

Harus mendeklarasikan variabel lain dan digunakan sebagai Out for TryParse.

LifeOfPi
sumber
Anda tidak perlu menginisialisasi startDatedan endDatekarena DateTime.TryParseakan selalu menimpanya dengan DateTime.MinValue. Jika representasi tanggal yang salah harus dikonversi ke nilai yang berbeda, periksa nilai yang dikembalikan DateTime.TryParsedan jika salah, setel nilainya secara eksplisit.
Palec
Menggunakan DateTime?( DateTime nullable )
Kiquenet
-1

double.Parse ("-"); memunculkan pengecualian, sementara double.TryParse ("-", out parsed); parsing ke 0 jadi saya kira TryParse melakukan konversi yang lebih kompleks.

eyaler
sumber
4
Tapi apakah TryParsekembali trueatau false? Begitulah cara Anda mengetahui apakah itu "valid".
Paul Draper