2010-08-24 34 views
115

Sử dụng tính năng này để kiểm tra xem c có phải là một ví dụ của TForm hay không.kiểm tra xem thể hiện loại

c.GetType().Name.CompareTo("TForm") == 0 

Có cách nào an toàn hơn để thực hiện việc này ngoài việc sử dụng chuỗi làm thông số CompareTo()?

+4

Wow, ai nói với bạn để làm điều đó theo cách đó ?! Vì vậy, nhiều bước bổ sung! –

+0

Tôi chủ yếu là một nhà phát triển Java, trong nhóm tôi hầu như không viết mã trong C#. – Lennie

+16

Tôi chắc chắn hy vọng bạn không làm điều đó trong Java theo cách đó. Ví dụ 'instanceof' và C# của' is' là cách tốt hơn để thực hiện nó. – Powerlord

Trả lời

293

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 ví dụ là của 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 TFormhoặc một lớp con sau đó sử dụng is/as:

if (c is TForm) 

hoặc

TForm form = c as TForm; 
if (form != null) 

Nó có giá trị là rõ ràng trong tâm trí của bạn về hành vi nào bạn thực sự muốn.

+6

Một lưu ý nhỏ: sử dụng "là" nếu bạn không muốn sử dụng kết quả của diễn viên và sử dụng "như" nếu bạn làm. –

+5

Với C# 7, bạn có thể kết hợp 'is' và' as' với đối sánh mẫu: 'if (x là TForm tf) {...' – Richard

11

Vâng, "là" từ khóa:

if (c is TForm) 
{ 
    ... 
} 

Xem chi tiết trên MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

Kiểm tra nếu một đối tượng là 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 là tương thích với kiểu chuỗi như thế này:

29
if(c is TFrom) 
{ 
    // Do Stuff 
} 

hoặc nếu bạn có kế hoạch sử dụng c như một TForm, sử dụng các 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. Nếu bạn kiểm tra xem nếu c là loại TForm sau đó cast nó, CLR trải qua một kiểm tra thêm. Đây là reference.

Edit: Bị đánh cắp từ Jon Skeet

Nếu bạn muốn chắc chắn cTForm và không bất kỳ lớp kế thừa từ TForm, sau đó sử dụng

if(c.GetType() == typeof(TForm)) 
{ 
    // Do stuff cause c is of type TForm and nothing else 
} 
3

Hãy thử như sau

if (c is TForm) { 
... 
} 
0

Hoặc

c.getType() == typeOf(TForm) 
-1
bool isValid = c.GetType() == typeof(TForm) ? true : false; 

hoặc đơn giản hơn

bool isValid = c.GetType() == typeof(TForm); 
+0

@slartidan, rất dễ thương. Điều này rõ ràng là hữu ích. – Gabe

+0

IMHO: Tôi sẽ tránh một lòng từ bi trực tiếp (ví dụ: '=='). Trong đối tượng hoặc ngôn ngữ định hướng hỗ trợ thừa kế trừ khi bạn biết rằng Loại cụ thể của bạn sẽ không bao giờ được thừa hưởng từ ví dụ một lớp 'niêm phong'. Ngoài ra: việc sử dụng toán tử ternary trả về giá trị boolean (tĩnh/không đổi) làm phiền tôi, tôi sẽ ít phiền toái hơn nếu đó là câu lệnh 'switch'. – SkidRunner

2

Như những người khác đã đề cập, "là" từ khóa. Tuy nhiên, nếu bạn định chuyển nó sang loại đó, ví dụ như.

TForm t = (TForm)c; 

Sau đó, bạn nên sử dụng từ khóa "dưới dạng".

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 là bởi vì nó là một tấm séc trùng lặp.

7

Ngoài ra, phần nào trong cùng một cách vô ích

Type.IsAssignableFrom(Type c) 

"True nếu c và Type hiện đại diện cho cùng loại, hoặc nếu Loại hiện nay là trong thừa kế hệ thống cấp bậc của c, hoặc nếu Loại hiện tại là giao diện c thực hiện hoặc nếu c là thông số loại chung và Loại hiện tại đại diện cho một trong các ràng buộc của c. "

Từ đây: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

+0

đây cũng là yêu thích cá nhân của tôi. 'typeof (Class) .IsAssignableFrom (object.getType())' tương tự như toán tử 'instanceof' của Java. – SkidRunner

+0

Liệu nó có sai không nếu chúng không nằm trong cùng một nhánh của hệ thống phân cấp thừa kế nhưng một toán tử chuyển đổi tồn tại? –

+0

Câu hỏi hay @PaulStelian. Tôi không chắc chắn trên đỉnh đầu của tôi nhưng tôi đoán là nó sẽ trả về một sai lầm trong tình huống đó. Điều đó ít nhất sẽ là hành vi mong đợi của tôi. Có thể nếu một chuyển đổi tiềm ẩn tồn tại, nó có thể trả về true nhưng điều đó sẽ là lẻ. –

5

Một chút nhỏ gọn hơn các câu trả lời khác nếu bạn muốn sử dụng c như một TForm:

if(c is TForm form){ 
    form.DoStuff(); 
} 
Các vấn đề liên quan