typeof
được áp dụng cho tên loại đã biết lúc biên dịch. Nó cũng có thể được áp dụng cho các tham số kiểu chung. GetType
được áp dụng cho một đối tượng trong thời gian chạy. Trong cả hai trường hợp, kết quả là một đối tượng thuộc loại System.Type
chứa siêu thông tin trên một loại.
Nếu bạn có
string s = "hello";
Hai dòng này có giá trị
Type t1 = typeof(string);
Type t2 = s.GetType();
Và sự so sánh này sản lượng true
t1 == t2 ==> true
Nhưng
object obj = "hello";
Hai dòng này có giá trị
Type t1 = typeof(object);
Type t2 = obj.GetType(); // ==> string!
Và sự so sánh này sản lượng false
t1 == t2 ==> false
tức, loại thời gian biên dịch (loại tĩnh) của biến obj
là không giống như thời gian chạy loại (loại động) của đối tượng được tham chiếu bởi obj
. (Ở đây "năng động" không có gì để làm với các từ khóa dynamic
!)
loại Testing
Tuy nhiên, nếu bạn chỉ muốn biết liệu mycontrol
là một TextBox
sau đó bạn chỉ có thể kiểm tra
if (mycontrol is TextBox)
Lưu ý rằng điều này không hoàn toàn tương đương với
if (mycontrol.GetType() == typeof(TextBox))
vì mycontrol
có thể có loại có nguồn gốc từ TextBox
. Trong trường hợp đó, so sánh đầu tiên mang lại true
và số thứ hai false
! Biến thể đầu tiên và dễ dàng hơn là OK trong hầu hết các trường hợp, vì điều khiển bắt nguồn từ TextBox
thừa hưởng mọi thứ mà TextBox
có, có thể thêm nhiều hơn cho nó và do đó gán tương thích với TextBox
.
public class MySpecializedTextBox : TextBox
{
}
MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox) ==> true
if (specialized.GetType() == typeof(TextBox)) ==> false
Đúc
Nếu bạn đã kiểm tra sau theo sau là một diễn viên và T là nullable ...
if (obj is T) {
T x = (T)obj; // The casting tests, whether obj is T again!
...
}
... bạn có thể thay đổi nó. ..
T x = obj as T;
if (x != null) {
...
}
Kiểm tra xem một giá trị có thuộc loại đã cho và quá trình đúc (có liên quan đến thử nghiệm này một lần nữa) có thể tốn thời gian cho các chuỗi dài thừa kế hay không. Sử dụng toán tử as
theo sau là một thử nghiệm cho null
hoạt động hiệu quả hơn.
Bắt đầu với C# 7.0 bạn có thể đơn giản hóa mã bằng cách sử dụng mẫu phù hợp:
if (obj is T t) {
// t is a variable of type T
...
}
ý của bạn là gì bởi tác phẩm này ... và điều này không ...? –
@ anouar204: Hãy thử chúng trong IDE của bạn. –
Không 'biên dịch' sẽ phù hợp hơn là không hoạt động ' –