Câu trả lời:
Parse
ném một ngoại lệ nếu nó không thể phân tích cú pháp giá trị, trong khi TryParse
trả về một bool
cho biết nó có thành công hay không.
TryParse
không chỉ try
/ catch
nộ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 Parse
phương thức sẽ gọi TryParse
và sau đó ném một ngoại lệ nếu nó trả về false
.
Tóm lại, hãy sử dụng Parse
nếu bạn chắc chắn giá trị sẽ hợp lệ; nếu không thì sử dụng TryParse
.
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ệ)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ệ.
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 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ệ).
Đố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ó.
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.
startDate
và endDate
như DateTime.TryParse
sẽ 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.TryParse
và nếu nó là sai, hãy đặt giá trị một cách rõ ràng.
DateTime?
( DateTime nullable )
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.
TryParse
trở lại true
hay false
không? Đó là cách bạn sẽ biết liệu nó có "hợp lệ" hay không.