ฉันมีคำถาม "แนวปฏิบัติที่ดีที่สุด" เกี่ยวกับ OOP ใน C # (แต่การเรียงลำดับจะใช้กับทุกภาษา)
พิจารณาการมีคลาสห้องสมุดที่มีวัตถุที่ต้องเปิดเผยต่อสาธารณะพูดผ่านตัวเข้าถึงคุณสมบัติ แต่เราไม่ต้องการให้ประชาชน (ผู้ที่ใช้คลาสไลบรารีนี้) เปลี่ยนมัน
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
เห็นได้ชัดว่าแนวทางที่ดีที่สุดคือ "ตัวเลือก C" แต่มีวัตถุเพียงไม่กี่ตัวที่มีตัวแปร ReadOnly (และแน่นอนว่าไม่มีคลาสที่ผู้ใช้กำหนดเอง)
หากคุณเป็นผู้ใช้งานคลาส A คุณคาดหวังว่าจะมีการเปลี่ยนแปลงหรือไม่
List<string> someList = ( new A() ).Items;
เผยแพร่ไปยังวัตถุ (A) เดิมหรือไม่ หรือมันโอเคที่จะส่งคืนโคลนนิ่งที่เขียนในคอมเม้นท์ / เอกสาร? ฉันคิดว่าวิธีการโคลนนี้อาจนำไปสู่ข้อบกพร่องที่ยากต่อการติดตาม
ฉันจำได้ว่าใน C ++ เราสามารถคืนค่าวัตถุ const และคุณสามารถเรียกวิธีการทำเครื่องหมายเป็น const ได้เท่านั้น ฉันเดาว่าไม่มีคุณสมบัติ / รูปแบบดังกล่าวใน C # หรือไม่ ถ้าไม่ทำไมพวกเขาจะไม่รวมมัน? ฉันเชื่อว่ามันถูกเรียกว่า const
แต่แล้วคำถามหลักของฉันอีกครั้งเกี่ยวกับ "สิ่งที่คุณคาดหวัง" หรือวิธีการจัดการตัวเลือก A vs B