พิจารณา:
1. ภาษา
การใช้∞สามารถแก้ปัญหาได้สูงสุด
ใน C # มีอยู่int.MaxValue
แต่คุณไม่สามารถใช้งานได้ในกรณีของคุณ int.MaxValue
เป็นจำนวนเต็มสูงสุด 2,147,483,647 หากในรหัสของคุณคุณมีค่าสูงสุดของบางสิ่งบางอย่างเช่นความดันสูงสุดที่ยอมรับได้ก่อนที่บางสิ่งจะระเบิดโดยใช้ 2,147,483,647 ไม่มีเหตุผล
2. กรอบงาน
.NET Framework ค่อนข้างไม่สอดคล้องกันในจุดนี้และการใช้ค่าเวทมนตร์สามารถถูกวิพากษ์วิจารณ์ได้
ตัวอย่างเช่นผลตอบแทนที่คุ้มค่ามายากล"Hello".IndexOf("Z")
-1
มันอาจจะทำให้ง่ายขึ้นในการจัดการผลลัพธ์:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
แทนที่จะใช้โครงสร้างที่กำหนดเอง:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
แต่ไม่ง่ายเลย ทำไม-1
ไม่-123
? ผู้เริ่มต้นอาจจะเข้าใจผิดคิดว่า0
หมายถึง "ไม่พบ" (position >= 0)
เกินไปหรือเพียงแค่พิมพ์ผิด
3. บริบท
หากรหัสของคุณเกี่ยวข้องกับการหมดเวลาในซ็อกเก็ตเครือข่ายการใช้บางสิ่งที่ทุกคนใช้มานานหลายทศวรรษเพื่อความสอดคล้องจะไม่ใช่ความคิดที่ผิด โดยเฉพาะอย่างยิ่ง0
สำหรับการหมดเวลามีความชัดเจนมาก: มันเป็นค่าที่ไม่สามารถเป็นศูนย์ การใช้คลาสที่กำหนดเองในกรณีนี้อาจทำให้เข้าใจยากขึ้น:
class Timeout
{
// A value indicating whether there is a timeout.
public bool IsTimeoutEnabled { get; set; }
// The duration of the timeout, in milliseconds.
public int Duration { get; set; }
}
- ฉันสามารถตั้งค่า
Duration
เป็น 0 ถ้าIsTimeoutEnabled
จริงหรือไม่?
- หาก
IsTimeoutEnabled
เป็นเท็จจะเกิดอะไรขึ้นถ้าฉันตั้งDuration
เป็น 100
สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดหลายประการ ลองนึกภาพโค้ดต่อไปนี้:
this.currentOperation.Timeout = new Timeout
{
// Set the timeout to 200 ms.; we don't want this operation to be longer than that.
Duration = 200,
};
this.currentOperation.Run();
การดำเนินการทำงานเป็นเวลาสิบวินาที คุณเห็นว่ามีอะไรผิดปกติกับรหัสนี้โดยไม่อ่านเอกสารประกอบการTimeout
เรียนหรือไม่
ข้อสรุป
null
เป็นการแสดงออกถึงแนวคิดที่ดีว่าค่าไม่ได้อยู่ที่นี่ มันไม่ได้ให้ ไม่ว่าง มันไม่ใช่ตัวเลขหรือสตริงศูนย์ / ว่างเปล่าหรืออะไรก็ตาม อย่าใช้เพื่อค่าสูงสุดหรือต่ำสุด
int.MaxValue
มีความเกี่ยวข้องอย่างยิ่งกับภาษาของตัวเอง อย่าใช้int.MaxValue
สำหรับการ จำกัด ความเร็วสูงสุดของVehicle
คลาสหรือความเร็วสูงสุดที่ยอมรับได้สำหรับเครื่องบิน ฯลฯ
หลีกเลี่ยงค่าเวทย์มนตร์เช่น-1
ในรหัสของคุณ พวกเขาทำให้เข้าใจผิดและนำไปสู่ข้อผิดพลาดในรหัส
สร้างคลาสของคุณเองซึ่งตรงไปตรงมามากขึ้นโดยระบุค่าต่ำสุด / สูงสุด ยกตัวอย่างเช่นสามารถมีVehicleSpeed
VehicleSpeed.MaxValue
อย่าทำตามคำแนะนำก่อนหน้านี้และใช้ค่าเวทย์มนตร์หากเป็นแบบแผนทั่วไปมานานหลายทศวรรษในสาขาเฉพาะที่ใช้โดยคนส่วนใหญ่เขียนรหัสในสาขานี้
อย่าลืมผสมวิธี ตัวอย่างเช่น:
class DnsQuery
{
public const int NoTimeout = 0;
public int Timeout { get; set; }
}
this.query.Timeout = 0; // For people who are familiar with timeouts set to zero.
// or
this.query.Timeout = DnsQuery.NoTimeout; // For other people.
¹คุณสามารถสร้างประเภทของคุณเองซึ่งรวมถึงอินฟินิตี้ ที่นี่ฉันพูดถึงint
ประเภทพื้นเมืองเท่านั้น