Phân tích cú pháp v. TryParse


111

Sự khác biệt giữa Parse () và TryParse () là gì?

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

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

Có một số hình thức kiểm tra lỗi như Khối thử bắt không?

Câu trả lời:


155

Parseném một ngoại lệ nếu nó không thể phân tích cú pháp giá trị, trong khi TryParsetrả về một boolcho biết nó có thành công hay không.

TryParsekhông chỉ try/ catchnội bộ - toàn bộ điểm của nó là nó được thực hiện mà không có ngoại lệ để nó nhanh chóng. Trên thực tế, cách mà nó có nhiều khả năng được triển khai nhất là bên trong Parsephương thức sẽ gọi TryParsevà sau đó ném một ngoại lệ nếu nó trả về false.

Tóm lại, hãy sử dụng Parsenếu bạn chắc chắn giá trị sẽ hợp lệ; nếu không thì sử dụng TryParse.


1
"bên trong phương thức Phân tích cú pháp sẽ gọi TryParse" Ngoại trừ việc Phân tích cú pháp trước TryParse theo ngày tháng bằng một số phiên bản. Dĩ nhiên, họ có thể đã chuyển việc thực hiện cốt lõi để TryParse ...
Joel Coehoorn

4
@Joel - Tôi cho rằng họ đã di chuyển việc triển khai, nhưng tôi vừa xem xét với bộ phản xạ và chúng là các triển khai riêng biệt với chính xác cùng một mã khác với một mã có 'ném ...' và một có 'trả về sai'. Tôi tự hỏi tại sao chúng không được hợp nhất ?!
Greg Beech

6
Mặc dù, nghĩ về nó, Parse ném ra một số ngoại lệ khác nhau, vì vậy nếu tất cả những gì nó có là bool từ TryParse thì nó sẽ không biết nên ném cái nào.
Greg Beech

5
"sử dụng Phân tích cú pháp nếu bạn chắc chắn giá trị sẽ hợp lệ". Tôi muốn nói thêm, "nhưng bạn thừa nhận khả năng bạn có thể sai". Nếu bạn chắc chắn 100% nó có thể phân tích cú pháp, thì bạn cũng có thể sử dụng chính xác TryParse có thể nhanh hơn.
Jon

2
Và bởi "các ngoại lệ khác nhau", @GregBboards có nghĩa là thông điệp, không phải lớp học.
Paul Draper

26

Nếu không thể chuyển đổi chuỗi thành số nguyên, thì

  • int.Parse() sẽ ném một ngoại lệ
  • int.TryParse() sẽ trả về false (nhưng không đưa ra ngoại lệ)

Điều gì sẽ xảy ra nếu tôi sử dụng int.TryParse (some_method_that_throws_exception (), out int test)? Nó sẽ bắt bất kỳ ngoại lệ nào hoặc chỉ những ngoại lệ liên quan đến phân tích cú pháp?
Alexandru Antochi

@AlexandruAntochi Bạn không nên đặt câu hỏi dưới dạng nhận xét. Điều này sẽ khiến người khác hầu như không thể hưởng lợi từ những câu trả lời hữu ích. Tuy nhiên, để làm cho nó xứng đáng với thời gian của bạn, câu trả lời cho câu hỏi của bạn là không, int.TryParse sẽ không ném ra chút nào. Nếu phương thức không phân tích được, nó sẽ chỉ phản ánh điều này bằng giá trị trả về là false. Điều này giúp thuận tiện khi sử dụng if (int.TryParse… chỉ làm điều gì đó nếu quá trình phân tích cú pháp thành công.
Rob

3

Phương thức TryParse cho phép bạn kiểm tra xem thứ gì đó có thể phân tích được hay không. Nếu bạn thử Phân tích cú pháp như trong trường hợp đầu tiên với một int không hợp lệ, bạn sẽ nhận được một ngoại lệ trong khi trong TryParse, nó trả về một boolean cho bạn biết liệu phân tích cú pháp thành công hay không.

Như một chú thích cuối trang, việc chuyển null cho hầu hết các phương thức TryParse sẽ tạo ra một ngoại lệ.


Chuyển null sang các kiểu cơ bản (int, double, DateTime, v.v.) sẽ KHÔNG tạo ra ngoại lệ
Tiến sĩ Yunke

3

TryParse và thuế ngoại lệ

Phân tích cú pháp ném ra một ngoại lệ nếu việc chuyển đổi từ một chuỗi thành kiểu dữ liệu được chỉ định không thành công, trong khi TryParse rõ ràng tránh đưa ra một ngoại lệ.


TryParse sẽ ném ra một ngoại lệ nếu bạn chuyển null vào cho hầu hết các phương thức TryParse tích hợp.
Ray Booysen

1
Liên kết tuyệt vời. Tôi ngạc nhiên là vẫn chưa có ai bắt đầu cuộc thảo luận "cái nào là tốt nhất hoặc phương pháp viết mã nào nên được áp dụng".
Christian Madsen

0

TryParse không trả về giá trị, nó trả về mã trạng thái để cho biết liệu phân tích cú pháp có thành công hay không (và không đưa ra ngoại lệ).


6
TryParse không trả về giá trị thông qua tham số hai được chỉ định với từ khóa out.
Christian Madsen

0

Đối với bản ghi, tôi đang thử nghiệm hai mã: Điều đó chỉ đơn giản là cố gắng chuyển đổi từ một chuỗi thành một số và nếu nó không thành công thì hãy gán số bằng 0.

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

và:

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

Đối với c #, tùy chọn tốt nhất là sử dụng tryparse vì try & Catch thay thế đã đưa ra ngoại lệ

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

Tuy nhiên, nó rất chậm và không mong muốn, mã không dừng lại trừ khi ngoại lệ của Debug được giải quyết để dừng với nó.


Đoạn mã đầu tiên không có tác dụng gì, vì tmpint sẽ được đặt thành 0 nếu chuỗi không thể được phân tích cú pháp dưới dạng int.
Andrew Neely

0

Tôi biết đó là một bài đăng rất cũ nhưng tôi nghĩ đến việc chia sẻ thêm một số chi tiết về Parse vs TryParse.

Tôi đã gặp một tình huống trong đó DateTime cần được chuyển đổi thành String và nếu datevalue null hoặc string.empty, chúng tôi đang gặp phải một ngoại lệ. Để khắc phục điều này, chúng tôi đã thay thế Parse bằng TryParse và sẽ nhận được ngày mặc định.

Mã cũ:

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

Mã mới:

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

Phải khai báo một biến khác và được sử dụng làm Out cho TryParse.


Bạn không cần khởi tạo startDateendDatenhư DateTime.TryParsesẽ luôn ghi đè chúng bằng DateTime.MinValue. Nếu biểu thị ngày không chính xác nên được chuyển đổi thành một giá trị khác, hãy kiểm tra giá trị trả về DateTime.TryParsevà nếu nó là sai, hãy đặt giá trị một cách rõ ràng.
Palec,

Sử dụng DateTime?( DateTime nullable )
Kiquenet

-1

double.Parse ("-"); đưa ra một ngoại lệ, trong khi double.TryParse ("-", được phân tích cú pháp); phân tích cú pháp thành 0 nên tôi đoán TryParse thực hiện nhiều chuyển đổi phức tạp hơn.


4
Nhưng có TryParsetrở lại truehay falsekhông? Đó là cách bạn sẽ biết liệu nó có "hợp lệ" hay không.
Paul Draper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.