Ayrıştır - TryParse


111

Parse () ve TryParse () arasındaki fark nedir?

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

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

Try-Catch Bloğu gibi bir tür hata kontrolü var mı?

Yanıtlar:


155

Parsedeğeri ayrıştıramazsa bir istisna atarken, başarılı olup olmadığını gösteren TryParsebir döndürür bool.

TryParsesadece try/ catchdahili olarak değil - bütün mesele, istisnasız uygulanması ve böylece hızlı olmasıdır. Aslında, büyük olasılıkla uygulanma şekli, Parseyöntemin dahili olarak çağırması TryParseve geri dönerse bir istisna atmasıdır false.

Özetle, Parsedeğerin geçerli olacağından eminseniz kullanın ; aksi takdirde kullanın TryParse.


1
"Parse yöntemi dahili olarak TryParse'ı çağıracaktır" Ayrıştırma, TryParse'ı çeşitli sürümlere göre önceden tarihlendirmesi dışında. Tabii ki, temel uygulamayı TryParse'a taşıyabilirlerdi ...
Joel Coehoorn

4
@Joel - Uygulamayı değiştireceklerini varsaydım, ancak reflektörle bir göz attım ve biri 'fırlat ...' ve biri 'yanlış döndür' dışında tam olarak aynı koda sahip ayrı uygulamalar . Neden konsolide olmadıklarını merak ediyorum ?!
Greg Beech

6
Her ne kadar düşünürken, Parse bir dizi farklı istisna atıyor, bu yüzden tüm sahip olduğu TryParse'dan bir yankı olsaydı, hangisini atacağını bilemezdi.
Greg Beech

5
"Değerin geçerli olacağından eminseniz Ayrıştır'ı kullanın". "Ama yanılıyor olabileceğin olasılığını kabul ediyorsun" diye eklerdim. Ayrıştırabileceğinden% 100 emin olsaydınız, daha hızlı olabilecek TryParse'ı doğru bir şekilde kullanabilirsiniz.
Jon

2
Ve "farklı istisnalar" derken, @GregBeech sınıf değil, mesaj anlamına gelir.
Paul Draper

26

Dize bir tam sayıya dönüştürülemezse, o zaman

  • int.Parse() bir istisna atacak
  • int.TryParse() yanlış döndürür (ancak bir istisna oluşturmaz)

İnt. TryParse (some_method_that_throws_exception (), int testi dışında) kullanırsam ne olur? Herhangi bir istisnayı mı yoksa yalnızca ayrıştırmayla ilgili olanları mı yakalayacak?
Alexandru Antochi

@AlexandruAntochi Yorum olarak soru sormamalısınız. Bu, diğerlerinin yararlı cevaplardan yararlanmasını neredeyse imkansız hale getirecektir. Ancak, harcadığınız zamana değmesi için, sorunuzun cevabı hayır, int. TryParse hiç atmayacaktır. Yöntem ayrıştırılamazsa, bunu yalnızca false dönüş değeriyle yansıtır. Bu, if (int. TryParse… 'ı yalnızca ayrıştırma başarılı olursa bir şeyler yapmak için kullanmayı kolaylaştırır.
Rob

3

TryParse yöntemi, bir şeyin ayrıştırılabilir olup olmadığını test etmenize olanak sağlar. Ayrıştırmayı ilk örnekte olduğu gibi geçersiz bir int ile denerseniz, TryParse'deyken bir istisna alırsınız, ayrıştırmanın başarılı olup olmadığını size bildiren bir boole döndürür.

Dipnot olarak, çoğu TryParse yöntemine null olarak geçmek bir istisna oluşturacaktır.


Temel türlere (int, double, DateTime, vb.) Null geçmek bir istisna
ATMAZ

3

TryParse ve İstisna Vergisi

Bir dizeden belirtilen veri türüne dönüştürme başarısız olursa ayrıştırma bir istisna atarken, TryParse açıkça bir istisna atılmasını önler.


Çoğu integral TryParse yöntemi için null değerini iletirseniz, TryParse bir istisna atar.
Ray Booysen

1
Harika bağlantı. Henüz kimsenin "hangisinin en iyisi olduğu veya hangi kodlama pratiğinin uygulanması gerektiği" tartışmasına henüz başlamamış olmasına şaşırdım.
Christian Madsen

0

TryParse değeri döndürmez, ayrıştırmanın başarılı olup olmadığını belirtmek için bir durum kodu döndürür (ve bir istisna oluşturmaz).


6
TryParse, out anahtar sözcüğüyle belirtilen ikinci parametre aracılığıyla değeri döndürür.
Christian Madsen

0

Kayıt için iki kodu test ediyorum: Bu sadece bir dizeden bir sayıya dönüştürmeye çalışır ve başarısız olursa sayıyı sıfıra atar.

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

ve:

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

C # için en iyi seçenek tryparse kullanmaktır çünkü try & Catch alternatifi istisna atılır

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

Acı verici yavaş ve istenmeyen bir durumdur, ancak Debug istisnası onunla durdurulmadığı sürece kod durmaz.


İlk kod parçacığı hiçbir şey yapmaz, çünkü dizge int olarak ayrıştırılamıyorsa tmpint zaten sıfıra ayarlanmış olacaktır.
Andrew Neely

0

Bunun çok eski bir gönderi olduğunu biliyorum, ancak Parse vs TryParse hakkında birkaç ayrıntı daha paylaşmayı düşündüm.

DateTime'ın String'e dönüştürülmesi gereken ve datevalue null veya string.empty ise bir istisna ile karşı karşıya olduğumuz bir senaryom vardı. Bunun üstesinden gelmek için Parse'yi TryParse ile değiştirdik ve varsayılan tarihi alacağız.

Eski Kod:

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

Yeni kod:

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

Başka bir değişken bildirmeli ve TryParse için Out olarak kullanılmalıdır.


Başlatma yapmanıza gerek yoktur startDateve her zaman endDateolduğu gibi DateTime.TryParsebunların üzerine yazabilirsiniz DateTime.MinValue. Yanlış tarih temsillerinin farklı bir değere dönüştürülmesi gerekiyorsa, dönüş değerini kontrol edin DateTime.TryParseve yanlışsa değeri açıkça ayarlayın.
Palec

DateTime?( DateTime nullable ) kullanma
Kiquenet

-1

double.Parse ( "-"); double. TryParse ("-", ayrıştırılmış); 0'a ayrıştırır, bu yüzden TryParse'ın daha karmaşık dönüşümler yaptığını tahmin ediyorum.


4
Ama yok TryParsedönmek trueya false? "Geçerli" olup olmadığını bu şekilde anlayacaksınız.
Paul Draper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.