คำตอบด้านล่างนี้เขียนขึ้นเมื่อหลายปีก่อนและอัปเดตเมื่อเวลาผ่านไป ตั้งแต่ C # 7 คุณสามารถใช้การจับคู่รูปแบบ:
if (animal is Dog dog)
{
// Use dog here
}
โปรดทราบว่าdog
ยังอยู่ในขอบเขตหลังจากif
คำสั่ง แต่ไม่ได้รับมอบหมายอย่างแน่นอน
ไม่ไม่มี มันเป็นสำนวนที่จะเขียนสิ่งนี้มากกว่า:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
เมื่อพิจารณาว่า "ตามด้วยถ้า" ใช้วิธีนี้เกือบตลอดเวลามันอาจสมเหตุสมผลกว่าที่จะมีโอเปอเรเตอร์ซึ่งดำเนินการทั้งสองส่วนในคราวเดียว ปัจจุบันนี้ไม่ได้อยู่ใน C # 6 แต่อาจเป็นส่วนหนึ่งของ C # 7 หากมีการนำข้อเสนอการจับคู่รูปแบบมาใช้
ปัญหาคือว่าคุณไม่สามารถประกาศตัวแปรในส่วนเงื่อนไขของif
คำสั่งที่1 วิธีการที่ใกล้เคียงที่สุดที่ฉันนึกได้คือ:
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
นั่นเป็นเพียงที่น่ารังเกียจ ... (ฉันได้พยายามเพียงแค่มันและมันไม่ทำงาน. แต่โปรดกรุณาอย่าทำเช่นนี้. Oh, และคุณสามารถประกาศdog
ใช้var
แน่นอน.)
แน่นอนคุณสามารถเขียนวิธีการขยาย:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
จากนั้นโทรหาด้วย:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
อีกวิธีหนึ่งคุณสามารถรวมสองสิ่งนี้เข้าด้วยกัน:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
// EVIL EVIL EVIL
for (var t = value as T; t != null; t = null)
{
action(t);
}
}
คุณยังสามารถใช้วิธีการขยายโดยไม่มีการแสดงออกแลมบ์ดาในวิธีที่สะอาดกว่าสำหรับลูป:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
แล้ว:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1คุณสามารถกำหนดค่าในif
คำสั่งแม้ว่าฉันจะไม่ค่อยทำ มันไม่เหมือนกับการประกาศตัวแปร มันไม่ได้ชะมัดที่ผิดปกติสำหรับผมที่จะทำมันในwhile
แต่เมื่ออ่านลำธารของข้อมูล ตัวอย่างเช่น:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
วันนี้ปกติฉันชอบใช้เสื้อคลุมที่ให้ฉันใช้foreach (string line in ...)
แต่ฉันดูด้านบนเป็นรูปแบบสวย ปกติแล้วมันจะไม่ดีที่จะมีผลข้างเคียงภายในเงื่อนไข แต่ตัวเลือกมักจะเกี่ยวข้องกับการทำสำเนารหัสและเมื่อคุณรู้ว่ารูปแบบนี้จะทำให้ถูกต้องได้ง่าย
bool
สภาพเป็นอย่างไร