ฉันต้องการอธิบายรายละเอียดเกี่ยวกับประเด็นเฉพาะที่ Eric Lippert ทำไว้ในคำตอบของเขาและให้ความสำคัญกับโอกาสเฉพาะที่ไม่มีใครแตะต้องเลย เอริคกล่าวว่า:
[... ] งานที่มอบหมายมักจะทิ้งค่าที่เพิ่งกำหนดไว้ในทะเบียน
ฉันอยากจะบอกว่างานจะทิ้งค่าที่เราพยายามกำหนดให้กับตัวถูกดำเนินการด้านซ้ายของเราเสมอ ไม่ใช่แค่ "เกือบตลอดเวลา" แต่ฉันไม่รู้เพราะฉันไม่พบปัญหานี้ที่แสดงความคิดเห็นไว้ในเอกสาร ในทางทฤษฎีแล้วอาจเป็นขั้นตอนการปฏิบัติที่มีประสิทธิภาพมากในการ "ละทิ้ง" และไม่ประเมินค่าตัวถูกดำเนินการด้านซ้ายอีกครั้ง แต่มีประสิทธิภาพหรือไม่?
'มีประสิทธิภาพ' ใช่สำหรับตัวอย่างทั้งหมดที่สร้างขึ้นในคำตอบของชุดข้อความนี้ แต่มีประสิทธิภาพในกรณีของคุณสมบัติและดัชนีที่ใช้ get- และ set accessors? ไม่ใช่เลย. พิจารณารหัสนี้:
class Test
{
public bool MyProperty { get { return true; } set { ; } }
}
ที่นี่เรามีคุณสมบัติซึ่งไม่ใช่แม้แต่ Wrapper สำหรับตัวแปรส่วนตัว เมื่อใดก็ตามที่เรียกร้องเขาจะกลับมาเป็นจริงเมื่อใดก็ตามที่มีคนพยายามกำหนดคุณค่าของเขาเขาจะไม่ทำอะไร ดังนั้นเมื่อใดก็ตามที่มีการประเมินคุณสมบัตินี้เขาจะเป็นคนจริง มาดูกันว่าเกิดอะไรขึ้น:
Test test = new Test();
if ((test.MyProperty = false) == true)
Console.WriteLine("Please print this text.");
else
Console.WriteLine("Unexpected!!");
เดาว่ามันพิมพ์อะไร? Unexpected!!
มันพิมพ์ ปรากฎว่า set accessor ถูกเรียกอย่างแท้จริงซึ่งไม่ได้ทำอะไรเลย แต่หลังจากนั้นจะไม่มีการเรียก get accessor เลย การมอบหมายนั้นทิ้งfalse
คุณค่าที่เราพยายามกำหนดให้กับทรัพย์สินของเรา และfalse
ค่านี้คือสิ่งที่คำสั่ง if ประเมิน
ฉันจะจบด้วยตัวอย่างโลกแห่งความเป็นจริงที่ช่วยให้ฉันค้นคว้าปัญหานี้ ฉันสร้างตัวสร้างดัชนีซึ่งเป็นกระดาษห่อหุ้มที่สะดวกสำหรับคอลเลกชัน ( List<string>
) ที่คลาสของฉันมีเป็นตัวแปรส่วนตัว
พารามิเตอร์ที่ส่งไปยังตัวสร้างดัชนีคือสตริงซึ่งจะถือว่าเป็นค่าในคอลเล็กชันของฉัน get accessor จะส่งคืนจริงหรือเท็จหากมีค่านั้นอยู่ในรายการหรือไม่ ดังนั้น get accessor จึงเป็นอีกวิธีหนึ่งในการใช้List<T>.Contains
วิธีนี้
ถ้าผู้เข้าถึงชุดของดัชนีถูกเรียกด้วยสตริงเป็นอาร์กิวเมนต์และตัวถูกดำเนินการด้านขวาคือบูtrue
ลเขาจะเพิ่มพารามิเตอร์นั้นในรายการ แต่ถ้าพารามิเตอร์เดียวกันถูกส่งไปยัง accessor และตัวถูกดำเนินการด้านขวาคือบูfalse
ลเขาจะลบองค์ประกอบออกจากรายการแทน ดังนั้นการเข้าถึงชุดถูกใช้เป็นทางเลือกที่สะดวกทั้งสองและList<T>.Add
List<T>.Remove
ฉันคิดว่าฉันมี "API" ที่เป็นระเบียบและกะทัดรัดในการตัดรายการโดยใช้ตรรกะของตัวเองเป็นเกตเวย์ ด้วยความช่วยเหลือของตัวสร้างดัชนีเพียงอย่างเดียวฉันสามารถทำหลาย ๆ อย่างได้ด้วยการกดแป้นไม่กี่ชุด ตัวอย่างเช่นฉันจะพยายามเพิ่มมูลค่าให้กับรายการของฉันและตรวจสอบได้อย่างไรว่าอยู่ในรายการนั้น ฉันคิดว่านี่เป็นรหัสบรรทัดเดียวที่จำเป็น:
if (myObject["stringValue"] = true)
; // Set operation succeeded..!
แต่ดังตัวอย่างก่อนหน้านี้ของฉันแสดงให้เห็นว่า get accessor ซึ่งควรจะดูว่าค่าอยู่ในรายการนั้นไม่ได้ถูกเรียกด้วยซ้ำ true
ค่าถูกทิ้งไว้ข้างหลังเสมอได้อย่างมีประสิทธิภาพทำลายสิ่งตรรกะที่ผมได้นำมาใช้ในการเข้าถึงของฉันได้รับ