ใช่มีเหตุผลที่ดี:
- ระบุสิ่งที่เป็นโมฆะซึ่งอาจไม่ชัดเจนจากไฟล์
NullReferenceException
- ทำให้รหัสล้มเหลวในการป้อนข้อมูลที่ไม่ถูกต้องแม้ว่าเงื่อนไขอื่น ๆ จะหมายความว่าค่าไม่ได้ถูกอ้างถึง
- มันทำให้ข้อยกเว้นเกิดขึ้นก่อนที่วิธีการนี้อาจมีผลข้างเคียงอื่น ๆ ที่คุณอาจถึงก่อนการหักล้างครั้งแรก
- มันหมายความว่าคุณสามารถมั่นใจได้ว่าถ้าคุณผ่านพารามิเตอร์เป็นอย่างอื่นที่คุณไม่ได้ละเมิดของพวกเขาสัญญา
- จัดทำเอกสารข้อกำหนดวิธีการของคุณ (การใช้Code Contractsจะดียิ่งขึ้นสำหรับสิ่งนั้น)
ตอนนี้สำหรับการคัดค้านของคุณ:
- ช้ากว่า : คุณพบว่าสิ่งนี้เป็นคอขวดในโค้ดของคุณจริง ๆหรือคุณกำลังคาดเดา? การตรวจสอบความเป็นโมฆะนั้นรวดเร็วมากและในกรณีส่วนใหญ่การตรวจสอบจะไม่เป็นปัญหาคอขวด
- ทำให้รหัสรักษายากขึ้น : ฉันคิดว่าตรงกันข้าม ฉันคิดว่ามันง่ายกว่าที่จะใช้โค้ดที่มันทำให้ชัดเจนว่าพารามิเตอร์สามารถเป็นโมฆะได้หรือไม่และคุณมั่นใจว่าเงื่อนไขนั้นถูกบังคับใช้
และสำหรับการยืนยันของคุณ:
เห็นได้ชัดว่ารหัสที่ใช้ s จะทำให้เกิดข้อยกเว้นอยู่ดี
จริงๆ? พิจารณา:
void f(SomeType s)
{
Console.WriteLine("I've got a message of {0}", s);
}
ที่ใช้s
แต่ไม่ได้ทำให้เกิดข้อยกเว้น หากไม่ถูกต้องเนื่องจากs
เป็นโมฆะและนั่นบ่งชี้ว่ามีบางอย่างผิดปกติข้อยกเว้นคือพฤติกรรมที่เหมาะสมที่สุดที่นี่
ตอนนี้ที่คุณใส่การตรวจสอบความถูกต้องของอาร์กิวเมนต์นั้นเป็นเรื่องที่แตกต่างออกไป คุณอาจตัดสินใจที่จะเชื่อถือรหัสทั้งหมดในชั้นเรียนของคุณเองดังนั้นอย่ากังวลกับวิธีการส่วนตัว คุณอาจตัดสินใจที่จะไว้วางใจส่วนที่เหลือของชุดประกอบของคุณดังนั้นอย่ากังวลกับวิธีการภายใน คุณควรตรวจสอบความถูกต้องของข้อโต้แย้งสำหรับวิธีการสาธารณะ
หมายเหตุด้านข้าง: โอเวอร์โหลดตัวสร้างพารามิเตอร์เดียวArgumentNullException
ควรเป็นชื่อพารามิเตอร์ดังนั้นการทดสอบของคุณควรเป็น:
if (s == null)
{
throw new ArgumentNullException("s");
}
อีกวิธีหนึ่งคือคุณสามารถสร้างวิธีการขยายโดยปล่อยให้ตัวปรับลดลง:
s.ThrowIfNull("s");
ในวิธีการขยาย (ทั่วไป) เวอร์ชันของฉันฉันทำให้มันคืนค่าเดิมถ้ามันไม่ใช่โมฆะทำให้คุณสามารถเขียนสิ่งต่างๆเช่น:
this.name = name.ThrowIfNull("name");
นอกจากนี้คุณยังสามารถโอเวอร์โหลดได้โดยไม่ใช้ชื่อพารามิเตอร์หากคุณไม่ใส่ใจเกินไป