แยกวิเคราะห์ v. TryParse


111

อะไรคือความแตกต่างระหว่าง Parse () และ TryParse ()?

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

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

มีการตรวจสอบข้อผิดพลาดบางรูปแบบเช่น Try-Catch Block หรือไม่?

คำตอบ:


155

Parseแสดงข้อยกเว้นหากไม่สามารถแยกวิเคราะห์ค่าได้ในขณะที่TryParseส่งกลับการboolระบุว่าสำเร็จหรือไม่

TryParseไม่เพียงtry/ catchภายใน - ประเด็นทั้งหมดคือการใช้งานโดยไม่มีข้อยกเว้นเพื่อให้เป็นไปอย่างรวดเร็ว ในความเป็นจริงวิธีที่มีแนวโน้มว่าจะนำไปใช้มากที่สุดคือParseวิธีการภายในจะเรียกใช้TryParseแล้วโยนข้อยกเว้นหากส่งคืนfalseแล้วโยนยกเว้นถ้ามันกลับ

สรุปให้ใช้Parseหากคุณแน่ใจว่าค่านั้นถูกต้อง TryParseมิฉะนั้นใช้


1
"ภายในเมธอด Parse จะเรียก TryParse" ยกเว้นว่า Parse pre-date TryParse โดยหลายเวอร์ชัน แน่นอนพวกเขาสามารถย้ายการใช้งานหลักไปยัง TryParse ได้ ...
Joel Coehoorn

4
@Joel - ผมถือว่าพวกเขาจะได้ย้ายการดำเนินการ แต่ผมเพิ่งได้ดูพร้อมแผ่นสะท้อนและพวกเขาจะใช้งานแบบแยกต่างหากที่ว่ารหัสเดียวกันอื่น ๆ มากกว่าหนึ่งมี 'โยน ... และหนึ่งที่มีผลตอบแทนที่เป็นเท็จ' ฉันสงสัยว่าทำไมพวกเขาถึงไม่รวม?!
Greg Beech

6
แม้ว่าเมื่อคิดถึงเรื่องนี้ Parse ก็มีข้อยกเว้นที่แตกต่างกันออกไปดังนั้นหากสิ่งที่มีทั้งหมดเป็นบูลจาก TryParse ก็จะไม่รู้ว่าควรโยนอันไหน
Greg Beech

5
"ใช้แยกวิเคราะห์หากคุณแน่ใจว่าค่าถูกต้อง" ฉันจะเพิ่ม "แต่คุณรับทราบความเป็นไปได้ที่คุณอาจคิดผิด" หากคุณแน่ใจ 100% ว่าสามารถแยกวิเคราะห์ได้คุณก็สามารถใช้ TryParse ได้อย่างถูกต้องซึ่งอาจเร็วกว่า
จอน

2
และตาม "ข้อยกเว้นที่แตกต่างกัน" @GregBeech หมายถึงข้อความไม่ใช่ชั้นเรียน
Paul Draper

26

หากไม่สามารถแปลงสตริงเป็นจำนวนเต็มได้

  • int.Parse() จะทำให้เกิดข้อยกเว้น
  • int.TryParse() จะส่งคืนเท็จ (แต่ไม่โยนข้อยกเว้น)

จะเกิดอะไรขึ้นถ้าฉันใช้ int.TryParse (some_method_that_throws_exception () ออกจากการทดสอบ int) จะจับข้อยกเว้นหรือเฉพาะข้อที่เกี่ยวข้องกับการแยกวิเคราะห์?
Alexandru Antochi

@AlexandruAntochi คุณไม่ควรถามคำถามเป็นความคิดเห็น สิ่งนี้จะทำให้คนอื่นแทบไม่ได้รับประโยชน์จากคำตอบที่เป็นประโยชน์ อย่างไรก็ตามเพื่อให้คุ้มค่ากับเวลาของคุณคำตอบสำหรับคำถามของคุณคือไม่ int TryParse จะไม่โยนเลย หากเมธอดไม่สามารถแยกวิเคราะห์ได้ก็จะสะท้อนค่านี้โดยค่าที่ส่งคืนเป็นเท็จเท่านั้น ทำให้สะดวกในการใช้ if (int.TryParse …เพื่อทำบางสิ่งบางอย่างเท่านั้นหากการแยกวิเคราะห์สำเร็จ
Rob

3

วิธีการ TryParse ช่วยให้คุณสามารถทดสอบว่ามีบางสิ่งที่แยกวิเคราะห์ได้หรือไม่ หากคุณลอง Parse เหมือนในอินสแตนซ์แรกด้วย int ที่ไม่ถูกต้องคุณจะได้รับข้อยกเว้นในขณะที่อยู่ใน TryParse จะส่งคืนบูลีนเพื่อแจ้งให้คุณทราบว่าการแยกวิเคราะห์สำเร็จหรือไม่

ในฐานะเชิงอรรถการส่งผ่านค่าว่างไปยังเมธอด TryParse ส่วนใหญ่จะทำให้เกิดข้อยกเว้น


การส่งค่า null ไปยังประเภทพื้นฐาน (int, double, DateTime และอื่น ๆ ) จะไม่ทำให้เกิดข้อยกเว้น
Dr Yunke

3

TryParse และภาษีข้อยกเว้น

การแยกวิเคราะห์จะแสดงข้อยกเว้นหากการแปลงจากสตริงเป็นประเภทข้อมูลที่ระบุล้มเหลวในขณะที่ TryParse หลีกเลี่ยงการโยนข้อยกเว้นอย่างชัดเจน


TryParse จะทำให้เกิดข้อยกเว้นหากคุณส่งค่า null ในเมธอด TryParse ที่สำคัญที่สุด
Ray Booysen

1
ลิงค์ที่ดี ฉันแปลกใจที่ยังไม่มีใครเริ่มการอภิปราย "ข้อใดดีที่สุดหรือควรใช้วิธีการเขียนโค้ดแบบใด"
Christian Madsen

0

TryParse ไม่ส่งคืนค่าโดยจะส่งคืนรหัสสถานะเพื่อระบุว่าการแยกวิเคราะห์สำเร็จหรือไม่ (และไม่ส่งข้อยกเว้น)


6
TryParse ส่งคืนค่าผ่านพารามิเตอร์สองซึ่งระบุด้วยคีย์เวิร์ด out
Christian Madsen

0

สำหรับเร็กคอร์ดฉันกำลังทดสอบรหัสสองรหัสนั่นก็แค่พยายามแปลงจากสตริงเป็นตัวเลขและหากล้มเหลวให้กำหนดตัวเลขเป็นศูนย์

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

และ:

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

สำหรับ c # ตัวเลือกที่ดีที่สุดคือใช้ tryparse เนื่องจากทางเลือก try & Catch ทำให้เกิดข้อยกเว้น

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

ว่ามันเจ็บปวดช้าและไม่พึงปรารถนาอย่างไรก็ตามโค้ดจะไม่หยุดจนกว่าจะมีการตัดสินข้อยกเว้นของ Debug เพื่อหยุดด้วย


ข้อมูลโค้ดแรกไม่ทำอะไรเลยเนื่องจาก tmpint จะถูกตั้งค่าเป็นศูนย์อยู่แล้วหากสตริงไม่สามารถแยกวิเคราะห์เป็น int ได้
Andrew Neely

0

ฉันรู้ว่ามันเป็นโพสต์เก่ามาก แต่คิดถึงการแบ่งปันรายละเอียดเพิ่มเติมเกี่ยวกับ Parse vs TryParse

ฉันมีสถานการณ์ที่ต้องแปลง DateTime เป็น String และถ้า datevalue null หรือ string.empty เรากำลังเผชิญกับข้อยกเว้น เพื่อเอาชนะสิ่งนี้เราได้แทนที่ Parse ด้วย TryParse และจะได้รับวันที่เริ่มต้น

รหัสเก่า:

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

รหัสใหม่:

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

ต้องประกาศตัวแปรอื่นและใช้เป็น Out สำหรับ TryParse


คุณไม่จำเป็นต้องเริ่มต้นstartDateและendDateเป็นมักจะเขียนทับพวกเขาด้วยDateTime.TryParse DateTime.MinValueหากการแทนค่าวันที่ไม่ถูกต้องควรถูกแปลงเป็นค่าอื่นให้ตรวจสอบค่าที่ส่งคืนของDateTime.TryParseและถ้าเป็นเท็จให้ตั้งค่าอย่างชัดเจน
Palec

การใช้DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ("-"); ทำให้เกิดข้อยกเว้นในขณะที่ double.TryParse ("-" แยกวิเคราะห์); แยกวิเคราะห์เป็น 0 ดังนั้นฉันเดาว่า TryParse ทำการแปลงที่ซับซ้อนกว่า


4
แต่TryParseกลับtrueหรือfalse? นั่นเป็นวิธีที่คุณจะทราบได้ว่า "ถูกต้อง" หรือไม่
Paul Draper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.