Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

TimeSpan.Zero ใน C#: การแสดงค่า "ไม่มีเวลา" อย่างแม่นยำ

TimeSpan.Zero เป็นค่าคงที่ (static readonly field) ที่แทนค่า TimeSpan ที่มีค่าเป็นศูนย์พอดี (00:00:00) ใช้สำหรับการเริ่มต้นค่า เปรียบเทียบ หรือรีเซ็ตค่า TimeSpan

รูปแบบการใช้งาน

TimeSpan ts = TimeSpan.Zero; // เทียบเท่า new TimeSpan(0)

โค้ดตัวอย่างสมบูรณ์

using System;

public class Demo
{
    public static void Main()
    {
        // สร้าง TimeSpan.Zero
        TimeSpan zero = TimeSpan.Zero;
        
        Console.WriteLine($"TimeSpan.Zero: {zero}");
        Console.WriteLine($"TotalDays: {zero.TotalDays}");
        Console.WriteLine($"TotalHours: {zero.TotalHours}");
        Console.WriteLine($"TotalMinutes: {zero.TotalMinutes}");
        Console.WriteLine($"TotalSeconds: {zero.TotalSeconds}");
        Console.WriteLine($"TotalMilliseconds: {zero.TotalMilliseconds}");
        Console.WriteLine($"Ticks: {zero.Ticks}");
        
        // การเปรียบเทียบ
        Console.WriteLine("\n--- การเปรียบเทียบ ---");
        TimeSpan ts1 = new TimeSpan(1, 0, 0); // 1 ชั่วโมง
        TimeSpan ts2 = TimeSpan.Zero;
        
        Console.WriteLine($"ts1 > TimeSpan.Zero: {ts1 > TimeSpan.Zero}"); // True
        Console.WriteLine($"ts2 == TimeSpan.Zero: {ts2 == TimeSpan.Zero}"); // True
        Console.WriteLine($"TimeSpan.Zero == TimeSpan.Zero: {TimeSpan.Zero == TimeSpan.Zero}"); // True
        
        // การใช้งานจริง: เริ่มต้นค่าสะสม
        Console.WriteLine("\n--- การสะสมเวลา ---");
        TimeSpan total = TimeSpan.Zero;
        TimeSpan[] intervals = 
        {
            TimeSpan.FromHours(1),
            TimeSpan.FromMinutes(30),
            TimeSpan.FromSeconds(45)
        };
        
        foreach (var interval in intervals)
        {
            total += interval;
            Console.WriteLine($"เพิ่ม {interval} → รวม: {total}");
        }
        
        // การใช้งาน: ตรวจสอบว่ามีระยะเวลาหรือไม่
        Console.WriteLine("\n--- ตรวจสอบระยะเวลา ---");
        TimeSpan? nullableTs = null;
        TimeSpan effectiveTs = nullableTs ?? TimeSpan.Zero;
        Console.WriteLine($"Nullable TimeSpan ที่เป็น null → ใช้ Zero: {effectiveTs}");
    }
}

ผลลัพธ์

TimeSpan.Zero: 00:00:00
TotalDays: 0
TotalHours: 0
TotalMinutes: 0
TotalSeconds: 0
TotalMilliseconds: 0
Ticks: 0

--- การเปรียบเทียบ ---
ts1 > TimeSpan.Zero: True
ts2 == TimeSpan.Zero: True
TimeSpan.Zero == TimeSpan.Zero: True

--- การสะสมเวลา ---
เพิ่ม 01:00:00 → รวม: 01:00:00
เพิ่ม 00:30:00 → รวม: 01:30:00
เพิ่ม 00:00:45 → รวม: 01:30:45

--- ตรวจสอบระยะเวลา ---
Nullable TimeSpan ที่เป็น null → ใช้ Zero: 00:00:00

TimeSpan.Zero vs new TimeSpan(0) vs default(TimeSpan)

วิธีสร้างโค้ดผลลัพธ์หมายเหตุ
Static FieldTimeSpan.Zero00:00:00อ่านง่ายที่สุด ประสิทธิภาพดี (Singleton)
Constructornew TimeSpan(0)00:00:00สร้างอินสแตนซ์ใหม่ทุกครั้ง
Default Valuedefault(TimeSpan)00:00:00สำหรับ generic/struct initialization
FromTicksTimeSpan.FromTicks(0)00:00:00ชัดเจนว่าเป็น 0 ticks

การใช้งานร่วมกับ LINQ

var timeSpans = new[]
{
    TimeSpan.FromHours(1),
    TimeSpan.FromMinutes(30),
    TimeSpan.Zero, // รวมศูนย์ได้
    TimeSpan.FromSeconds(45)
};

TimeSpan sum = timeSpans.Aggregate(TimeSpan.Zero, (acc, ts) => acc + ts);
Console.WriteLine($"ผลรวม: {sum}"); // 01:30:45

// หาค่าสูงสุด (ข้าม Zero ได้ถ้าต้องการ)
TimeSpan max = timeSpans.Where(ts => ts > TimeSpan.Zero).Max();

ข้อควรระวัง

  • TimeSpan.Zero เป็น readonly - ไม่สามารถแก้ไขค่าได้
  • เหมาะสำหรับค่าเริ่มต้น (Default value) ของฟิลด์/พร็อพเพอร์ตี้
  • ใช้ใน ?? (Null-coalescing) สำหรับ TimeSpan? (Nullable)
  • การเปรียบเทียบกับ Zero ใช้ Operator ธรรมดา (>, <, ==, !=)