เป็นรูปแบบที่ดีที่จะทำเมื่อสมาชิกไม่มีจุดหมายในบริบท ตัวอย่างเช่นหากคุณสร้างคอลเลกชันแบบอ่านอย่างเดียวที่ดำเนินการIList<T>
โดยมอบหมายให้กับวัตถุภายใน_wrapped
คุณอาจมีลักษณะดังนี้:
public T this[int index]
{
get
{
return _wrapped[index];
}
}
T IList<T>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
public int Count
{
get { return _wrapped.Count; }
}
bool ICollection<T>.IsReadOnly
{
get
{
return true;
}
}
ที่นี่เรามีสี่กรณีที่แตกต่างกัน
public T this[int index]
ถูกกำหนดโดยคลาสของเราแทนที่จะเป็นอินเตอร์เฟสและด้วยเหตุนี้จึงไม่ใช่การใช้งานที่ชัดเจนแม้ว่าจะทราบว่ามันจะคล้ายกับการอ่าน - เขียนที่T this[int index]
กำหนดในอินเตอร์เฟส แต่เป็นแบบอ่านอย่างเดียว
T IList<T>.this[int index]
มีความชัดเจนเนื่องจากส่วนหนึ่งของมัน (ผู้ทะเยอทะยาน) ได้รับการจับคู่อย่างสมบูรณ์แบบโดยคุณสมบัติด้านบนและส่วนอื่น ๆ จะทำให้เกิดข้อยกเว้น ในขณะที่มีความสำคัญต่อคนที่เข้าถึงอินสแตนซ์ของคลาสนี้ผ่านอินเทอร์เฟซก็ไม่มีประโยชน์ที่ใครบางคนใช้มันผ่านตัวแปรประเภทของคลาส
ในทำนองเดียวกันเพราะbool ICollection<T>.IsReadOnly
จะกลับมาจริงเสมอมันไม่มีจุดหมายอย่างเต็มที่กับรหัสที่เขียนกับประเภทของคลาส แต่อาจมีความสำคัญต่อการใช้มันผ่านประเภทของอินเตอร์เฟสดังนั้นเราจึงใช้มันอย่างชัดเจน
ในทางกลับกันpublic int Count
จะไม่ถูกนำไปใช้อย่างชัดเจนเพราะอาจเป็นประโยชน์ต่อผู้ที่ใช้อินสแตนซ์ผ่านประเภทของตัวเอง
แต่ด้วยกรณี "ที่ไม่ค่อยได้ใช้งาน" ของคุณฉันจะเอนตัวไปอย่างมากโดยไม่ใช้การดำเนินการที่ชัดเจน
ในกรณีที่ฉันแนะนำให้ใช้การใช้งานที่ชัดเจนเรียกวิธีการผ่านตัวแปรประเภทของคลาสจะเป็นข้อผิดพลาด (พยายามที่จะใช้ setter ดัชนี) หรือไม่มีจุดหมาย (การตรวจสอบค่าที่จะเหมือนกันเสมอ) ดังนั้นในการซ่อน พวกเขาคุณกำลังปกป้องผู้ใช้จากรหัสรถหรือย่อยที่ดีที่สุด ซึ่งแตกต่างจากรหัสที่คุณคิดว่าน่าจะมีการใช้น้อยมาก เพื่อที่ฉันจะพิจารณาใช้EditorBrowsable
คุณลักษณะเพื่อซ่อนสมาชิกจาก intellisense แม้ว่าฉันจะเบื่อ; สมองของผู้คนมีซอฟต์แวร์ของตนเองสำหรับการกรองสิ่งที่ไม่สนใจ