2014-04-15 13 views
13

Tôi đã xem xét một số mẫu mã của Microsoft cho cảm biến Kinect và đã tình cờ gặp phải dòng sau.Tại sao nên sử dụng TimeSpan.CompareTo() thay vì < > hoặc =

TimeSpan zeroDuration = TimeSpan.FromSeconds(0.0); 
TimeSpan timeRemaining = ...; 

if (timeRemaining.CompareTo(this.zeroDuration) > 0) 
{ 
} 

Tôi hiểu thế nào CompareTo() rất hữu ích trong các tình huống như sắp xếp nhưng tại sao nó sẽ được sử dụng trong một điều kiện if() thay vì cách tiếp cận trực tiếp hơn?

if (timeRemaining > this.zeroDuration) 
{ 
} 

PS: Tôi sẽ mang nó theo một hạt muối nếu nó xuất thân từ bất cứ nguồn nào khác nhưng với chất lượng chung của mã giả sử có một lý do

+0

tôi cho rằng đó chỉ là một sự khác biệt về phong cách, nhưng tôi có thể là sai. @Amicable đó là chủ yếu về so sánh bình đẳng khác nhau, không phải '>' vs 'CompareTo'. –

+0

Đối với TimeSpans, không có sự khác biệt. Tôi đoán là dev mẫu không nhận thức được rằng các toán tử quá tải đã tồn tại. –

+1

@Amicable null xuất hiện trước một chuỗi và nó sử dụng CultureInfo.CurrentCulture.CompareInfo.Compare, có nghĩa là nó sẽ sử dụng một so sánh phụ thuộc vào văn hóa. Điều này có nghĩa là ß sẽ so sánh bằng SS ở Đức, hoặc tương tự - không áp dụng cho TimeSpan –

Trả lời

12

Cả hai nội làm điều tương tự. So sánh Ticks và trả lại kết quả.

public int CompareTo(TimeSpan value) { 
    long t = value._ticks; 
    if (_ticks > t) return 1; 
    if (_ticks < t) return -1; 
    return 0; 
} 

public static bool operator <(TimeSpan t1, TimeSpan t2) { 
      return t1._ticks < t2._ticks; 
} 

Lý do duy nhất có thể là tình trạng quá tải khác cho CompareTo, mà nhận được một object loại kiểm tra tham số cho null và sau đó so sánh. Thực hiện như: Mã

public int CompareTo(Object value) { 
      if (value == null) return 1; 
      if (!(value is TimeSpan)) 
       throw new ArgumentException(Environment.GetResourceString("Arg_MustBeTimeSpan")); 
      long t = ((TimeSpan)value)._ticks; 
      if (_ticks > t) return 1; 
      if (_ticks < t) return -1; 
      return 0; 
     } 

Nguồn từ: Reference Source .NET Framework 4.5.1 - Microsoft

+1

Đó là liên kết tôi đang tìm kiếm câu trả lời của riêng tôi! +1 – BlackBear

Các vấn đề liên quan