Câu trả lời:
Các câu trả lời khác nhau ở đây có hai ý nghĩa khác nhau.
Nếu bạn muốn kiểm tra xem một thể hiện là một loại chính xác sau đó
if (c.GetType() == typeof(TForm))
là con đường để đi
Nếu bạn muốn biết liệu c
là một thể hiện của TForm
hoặc một lớp con thì hãy sử dụng is
/ as
:
if (c is TForm)
hoặc là
TForm form = c as TForm;
if (form != null)
Điều đáng để bạn rõ ràng trong đầu về hành vi nào bạn thực sự muốn.
is
và as
khớp mẫu:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
hoặc nếu bạn có kế hoạch sử dụng c
như một TForm
, hãy sử dụng ví dụ sau:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Ví dụ thứ hai chỉ cần kiểm tra xem c
có thuộc loại TForm
một lần không. Trong trường hợp nếu bạn kiểm tra xem nếu c
thuộc loại TForm
thì hãy bỏ nó, CLR trải qua kiểm tra thêm. Đây là một tài liệu tham khảo .
Chỉnh sửa: Bị đánh cắp từ Jon Skeet
Nếu bạn muốn chắc chắn c
là TForm
và không phải bất kỳ lớp nào kế thừa từ TForm
đó, thì hãy sử dụng
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Có, từ khóa "là":
if (c is TForm)
{
...
}
Xem chi tiết về MSDN: http://msdn.microsoft.com/en-us/l Library / scekt9xw (VS.80) .aspx
Kiểm tra nếu một đối tượng tương thích với một loại nhất định. Ví dụ, nó có thể được xác định nếu một đối tượng tương thích với loại chuỗi như thế này:
Ngoài ra, phần nào trong cùng một tĩnh mạch
Type.IsAssignableFrom(Type c)
"Đúng nếu c và Loại hiện tại biểu thị cùng loại hoặc nếu Loại hiện tại nằm trong phân cấp thừa kế của c hoặc nếu Loại hiện tại là giao diện mà c thực hiện hoặc nếu c là tham số loại chung và Loại hiện tại đại diện cho một trong những hạn chế của c. "
Từ đây: http://msdn.microsoft.com/en-us/l Library / system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())
tương tự như instanceof
toán tử Java .
T1.IsAssignableFrom(T2)
trả về true
trong các tình huống mà as
toán tử trả về giá trị khác null, với các thể hiện của các loại đó.
Nhỏ gọn hơn một chút so với các câu trả lời khác nếu bạn muốn sử dụng c làm TForm:
if(c is TForm form){
form.DoStuff();
}
Như những người khác đã đề cập, từ khóa "là". Tuy nhiên, nếu sau này bạn sẽ chuyển nó sang loại đó, vd.
TForm t = (TForm)c;
Sau đó, bạn nên sử dụng từ khóa "như".
ví dụ TForm t = c as TForm.
Sau đó bạn có thể kiểm tra
if(t != null)
{
// put TForm specific stuff here
}
Đừng kết hợp như với vì đó là một kiểm tra trùng lặp.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
hoặc đơn giản hơn
bool isValid = c.GetType() == typeof(TForm);
==
). Trong các ngôn ngữ đối tượng hoặc định hướng hỗ trợ kế thừa trừ khi bạn biết rằng Loại cụ thể của bạn sẽ không bao giờ được kế thừa từ một sealed
Lớp. Ngoài ra: việc sử dụng một toán tử ternary trả về các giá trị boolean (tĩnh / hằng) làm phiền tôi, tôi sẽ ít bận tâm hơn nếu đó là một switch
câu lệnh.
instanceof
và C #is
là những cách tốt hơn để làm điều đó.