C # เทียบเท่ากับ isInstance () ของ Java คืออะไร


คำตอบ:


52

สิ่งที่เทียบเท่ากับ Java obj.getClass().isInstance(otherObj)ใน C # มีดังนี้:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

โปรดทราบว่าในขณะที่ทั้ง Java และ C # ทำงานบนอ็อบเจ็กต์ประเภทรันไทม์ (Java java.lang.Class≣ C # System.Type) ของobj(via .getClass()vs .getType()) Java isInstanceจะใช้อ็อบเจ็กต์เป็นอาร์กิวเมนต์ในขณะที่ C # IsAssignableFromคาดว่าจะมีSystem.Typeอ็อบเจ็กต์อื่น


1
หมายเหตุ IsAssignableFrom ใช้ Type ไม่ใช่ object ดังนั้นคุณต้องทำ OtherObj.getType ()
FlySwat

3
ขอบคุณจอน - และจำไว้ว่านี่คือวิกิ! ฉันไม่แค้นคนที่แก้ไขข้อผิดพลาดของฉัน
Konrad Rudolph

1
น่าสนใจ ... ใน java JVM ปฏิบัติกับ "instanceof" เป็นพิเศษเห็นได้ชัดว่ามันเร็วมากซึ่งอาจอธิบายได้ว่าทำไมคีย์เวิร์ดถึงผิดปกติ (มีวิธี isAssignable ใน java ด้วย)
Michael Neale

เหตุใดวิธีนี้จึงดีกว่าตัวดำเนินการ "is" ซึ่งอ่านได้ง่ายกว่า
Timothy Gonzalez

@TimothyGonzalez เพราะมันทำอะไรที่แตกต่างออกไป เป็นการทดสอบว่าตัวแปรสองตัวมีประเภทเดียวกันหรือไม่ isต้องการชื่อประเภทตรงกันข้าม นี่คือสิ่งที่อยาก OP: isInstanceเทียบเท่าชวาของ คำตอบอื่น ๆ นั้นผิดเพียงแม้ว่าจะมีการโหวตเพิ่มขึ้นอย่างไร้สาระก็ตาม
Konrad Rudolph


39

ขึ้นอยู่กับใช้isถ้าคุณไม่ต้องการใช้ผลของการร่ายและใช้asถ้าคุณทำ คุณแทบไม่อยากเขียน:

if(foo is Bar) {
    return (Bar)foo;
}

แทน:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}

2

จากด้านบนของหัวฉันคุณสามารถทำได้:

bool result = ((obj as MyClass) != null)

ไม่แน่ใจว่าจะทำงานได้ดีกว่า ฉันจะปล่อยให้คนอื่นเปรียบเทียบ :)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.