Bạn sẽ nhận được các kết quả khác nhau cho các phương pháp khác nhau tùy thuộc vào việc bạn biên dịch có tối ưu hóa hay không. Về cơ bản bạn có một vài lựa chọn:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof(int)
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse(Convert.ToString(o), out j)
Bạn có thể dễ dàng thiết lập một ứng dụng giao diện điều khiển mà cố gắng từng 10.000 lần và trả về khoảng thời gian cho mỗi (kiểm tra khi o là một int và khi nó là cái gì khác).
Phương pháp try-catch
là nhanh nhất nếu đối tượng không giữ một int, và đến nay chậm nhất nếu nó không (thậm chí chậm hơn GetType
). int.TryParse
là khá nhanh nếu bạn có một chuỗi, nhưng nếu bạn có một đối tượng không rõ nó chậm hơn.
Điều thú vị là với .Net 3.5 và tối ưu hóa được bật kiểm tra o is int
mất cùng thời gian là try-catch
khi o thực sự là một int. o is int
chỉ chậm hơn một chút nếu o thực sự là cái gì khác.
Annoyingly FxCop sẽ ném lên cảnh báo nếu bạn làm điều gì đó như:
if(o is int)
int j = (int) o;
Nhưng tôi nghĩ đó là một lỗi trong FxCop - nó không biết int là một kiểu giá trị và khuyến cáo bạn sử dụng o as int
để thay thế.
Nếu đầu vào của bạn luôn là một chuỗi int.TryParse
là tốt nhất, nếu không, toán tử is
là nhanh nhất.
Khi bạn có một chuỗi, tôi sẽ xem xét liệu bạn có cần biết rằng đó là một int, chứ không phải là một đôi. Nếu số int.TryParse
vượt qua thì double.TryParse
để bạn có thể phân nửa số séc - trả lại số tiền gấp đôi hoặc chuỗi và tăng gấp đôi khi bạn mong đợi một int.
Mục tiêu cuối cùng là cố gắng xác định loại dữ liệu độc nhất cho đối tượng. 3 sẽ là một int. 3,5 sẽ là gấp đôi. "Ba" sẽ là một chuỗi. Cuối cùng tôi đã đặt cùng một hàm thử một loạt các đối tượng.TryParse gọi cho đến khi nó có thể xác định loại dữ liệu "phù hợp nhất" là gì. –