ในหนังสือที่ยอดเยี่ยมของเขา CLR Via C # เจฟฟรีย์ริชเตอร์กล่าวว่าเขาไม่ชอบคุณสมบัติและไม่แนะนำให้ใช้ เขาให้เหตุผลบางอย่าง แต่ฉันไม่เข้าใจจริงๆ ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไมฉันจึงควรหรือไม่ควรใช้คุณสมบัติ? ใน C # 3.0 ด้วยคุณสมบัติอัตโนมัติสิ่งนี้เปลี่ยนไปหรือไม่?
ในการอ้างอิงฉันได้เพิ่มความคิดเห็นของ Jeffrey Richter:
•คุณสมบัติอาจเป็นแบบอ่านอย่างเดียวหรือเขียนอย่างเดียว การเข้าถึงข้อมูลสามารถอ่านและเขียนได้เสมอ หากคุณกำหนดคุณสมบัติวิธีที่ดีที่สุดคือเสนอทั้ง get และ set accessor method
•วิธีคุณสมบัติอาจทำให้เกิดข้อยกเว้น การเข้าถึงฟิลด์ไม่เคยทำให้เกิดข้อยกเว้น
•คุณสมบัติไม่สามารถส่งผ่านเป็นพารามิเตอร์ out หรือ ref ไปยังเมธอดได้ ฟิลด์สามารถ ตัวอย่างเช่นรหัสต่อไปนี้จะไม่รวบรวม:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
•วิธีการคุณสมบัติอาจใช้เวลานานในการดำเนินการ การเข้าถึงฟิลด์มักจะเสร็จสมบูรณ์ในทันที เหตุผลทั่วไปในการใช้คุณสมบัติคือทำการซิงโครไนซ์เธรดซึ่งสามารถหยุดเธรดได้ตลอดไปดังนั้นจึงไม่ควรใช้คุณสมบัติหากจำเป็นต้องซิงโครไนซ์เธรด ในสถานการณ์นั้นแนะนำให้ใช้วิธีการ นอกจากนี้หากคลาสของคุณสามารถเข้าถึงได้จากระยะไกล (ตัวอย่างเช่นคลาสของคุณมาจาก System.MashalByRefObject) การเรียกใช้เมธอดคุณสมบัติจะช้ามากดังนั้นจึงควรใช้เมธอดสำหรับคุณสมบัติ ในความคิดของฉันคลาสที่มาจาก MarshalByRefObject ไม่ควรใช้คุณสมบัติ
•ถ้าเรียกหลายครั้งติดต่อกันวิธีคุณสมบัติอาจส่งคืนค่าที่แตกต่างกันในแต่ละครั้ง ฟิลด์จะส่งคืนค่าเดียวกันทุกครั้ง คลาส System.DateTime มีคุณสมบัติ readonly Now ที่ส่งคืนวันที่และเวลาปัจจุบัน ทุกครั้งที่คุณค้นหาคุณสมบัตินี้จะส่งคืนค่าที่แตกต่างกัน นี่เป็นข้อผิดพลาดและ Microsoft ต้องการให้พวกเขาแก้ไขคลาสโดยทำให้ Now เป็นวิธีการแทนคุณสมบัติ
•วิธีคุณสมบัติอาจทำให้เกิดผลข้างเคียงที่สังเกตได้ การเข้าถึงฟิลด์ไม่เคยทำ กล่าวอีกนัยหนึ่งผู้ใช้ประเภทหนึ่งควรสามารถตั้งค่าคุณสมบัติต่างๆที่กำหนดโดยประเภทตามลำดับใด ๆ ที่เขาหรือเธอเลือกโดยไม่สังเกตเห็นพฤติกรรมที่แตกต่างในประเภท
•วิธีคุณสมบัติอาจต้องใช้หน่วยความจำเพิ่มเติมหรือส่งคืนการอ้างอิงไปยังสิ่งที่ไม่ได้เป็นส่วนหนึ่งของสถานะของวัตถุจริงดังนั้นการปรับเปลี่ยนวัตถุที่ส่งคืนจึงไม่มีผลกระทบต่อวัตถุดั้งเดิม การค้นหาเขตข้อมูลจะส่งคืนการอ้างอิงไปยังวัตถุที่รับประกันว่าเป็นส่วนหนึ่งของสถานะของวัตถุดั้งเดิมเสมอ การทำงานกับพร็อพเพอร์ตี้ที่ส่งคืนสำเนาอาจสร้างความสับสนให้กับนักพัฒนาและมักไม่มีการจัดทำเป็นเอกสารลักษณะนี้