ใช้นี้เพื่อตรวจสอบว่าเป็นตัวอย่างของc
TForm
c.GetType().Name.CompareTo("TForm") == 0
มีวิธีที่ปลอดภัยกว่าที่จะทำนอกเหนือจากการใช้string
param เป็นCompareTo()
หรือไม่?
ใช้นี้เพื่อตรวจสอบว่าเป็นตัวอย่างของc
TForm
c.GetType().Name.CompareTo("TForm") == 0
มีวิธีที่ปลอดภัยกว่าที่จะทำนอกเหนือจากการใช้string
param เป็นCompareTo()
หรือไม่?
คำตอบ:
คำตอบที่ต่างกันที่นี่มีความหมายต่างกันสองแบบ
หากคุณต้องการตรวจสอบว่าอินสแตนซ์เป็นประเภทที่แน่นอนแล้ว
if (c.GetType() == typeof(TForm))
เป็นวิธีที่จะไป
หากคุณต้องการทราบว่าc
เป็นอินสแตนซ์ของTForm
หรือคลาสย่อยให้ใช้is
/ as
:
if (c is TForm)
หรือ
TForm form = c as TForm;
if (form != null)
มันคุ้มค่าที่จะต้องทราบชัดเจนว่าคุณต้องการพฤติกรรมแบบใด
is
และas
มีการจับคู่แบบ:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
หรือถ้าคุณวางแผนที่จะใช้c
เป็น a TForm
ใช้ตัวอย่างต่อไปนี้:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
ตัวอย่างที่สองจำเป็นต้องตรวจสอบเพื่อดูว่าc
เป็นประเภทTForm
หนึ่งครั้ง โดยที่ถ้าคุณตรวจสอบว่าดูว่าc
เป็นประเภทTForm
ไหนแล้วนำไปทิ้ง CLR จะได้รับการตรวจสอบพิเศษ นี่คือการอ้างอิง
แก้ไข: ขโมยจาก Jon Skeet
หากคุณต้องการให้แน่ใจว่าc
เป็นของTForm
และไม่ใช่คลาสที่สืบทอดมาTForm
ให้ใช้
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
ใช่คำหลัก "เป็น":
if (c is TForm)
{
...
}
ดูรายละเอียดเกี่ยวกับ MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
ตรวจสอบว่าวัตถุเข้ากันได้กับประเภทที่กำหนด ตัวอย่างเช่นสามารถกำหนดได้หากวัตถุเข้ากันได้กับชนิดสตริงเช่นนี้
นอกจากนี้ค่อนข้างอยู่ในหลอดเลือดดำเดียวกัน
Type.IsAssignableFrom(Type c)
"เป็นจริงถ้า c และชนิดปัจจุบันแสดงถึงชนิดเดียวกันหรือถ้าประเภทปัจจุบันอยู่ในลำดับชั้นการสืบทอดของ c หรือถ้าชนิดปัจจุบันเป็นอินเทอร์เฟซที่ c ใช้หรือถ้า c เป็นพารามิเตอร์ชนิดทั่วไปและชนิดปัจจุบัน หมายถึงหนึ่งในข้อ จำกัด ของ c "
จากที่นี่: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())
คล้ายกับตัวinstanceof
ดำเนินการJava
T1.IsAssignableFrom(T2)
ส่งคืนtrue
ในสถานการณ์ที่ตัวas
ดำเนินการส่งคืนค่าที่ไม่ใช่ค่า null ซึ่งกำหนดอินสแตนซ์ของประเภทเหล่านั้น
กะทัดรัดกว่าคำตอบอื่น ๆ เล็กน้อยหากคุณต้องการใช้ c เป็น TForm:
if(c is TForm form){
form.DoStuff();
}
ลองทำสิ่งต่อไปนี้
if (c is TForm) {
...
}
ดังที่คนอื่น ๆ พูดถึงคำหลัก "คือ" อย่างไรก็ตามหากคุณจะโยนมันในภายหลังในประเภทนั้นเช่น
TForm t = (TForm)c;
จากนั้นคุณควรใช้คำว่า "เป็น"
เช่น TForm t = c as TForm.
จากนั้นคุณสามารถตรวจสอบ
if(t != null)
{
// put TForm specific stuff here
}
อย่ารวมเช่นเดียวกับเนื่องจากเป็นเช็คที่ซ้ำกัน
หรือ
c.getType() == typeOf(TForm)
bool isValid = c.GetType() == typeof(TForm) ? true : false;
หรือเรียบง่าย
bool isValid = c.GetType() == typeof(TForm);
==
) ในภาษาเชิงวัตถุหรือภาษาที่สนับสนุนการสืบทอดเว้นแต่คุณจะรู้ว่าประเภทเฉพาะของคุณจะไม่ถูกสืบทอดจากเช่นsealed
คลาส นอกจากนี้: การใช้งานของผู้ประกอบการที่ประกอบไปด้วยกลับ (คงที่ / คงที่) ค่าบูลีนรบกวนจิตใจผมผมจะได้รับการใส่ใจน้อยถ้ามันเป็นswitch
คำสั่ง
instanceof
และ C #is
เป็นวิธีที่ดีกว่าในการทำเช่นนั้น