2012-06-21 32 views
7

Trong cấu trúc .Net framework DateTime, năm được định nghĩa là int (thực sự là A System.Int32). Tuy nhiên, tài liệu MSDN nói rằng giá trị sẽ luôn là between 1 and 9999. Vì vậy, một ushort (System.UInt16) là nhiều hơn đủ để lưu trữ các giá trị và chiếm một nửa không gian. Vậy tại sao nó là một int và không phải là một ushort?Tại sao DateTime.Now.Year một int và không phải là một ushort

Có chuyển đổi ngầm từ ushort thành int để không có quá trình truyền cần thực hiện để thực hiện số học số nguyên trong năm.

Tôi nhận thấy đây là vấn đề tối ưu hóa vi mô và do đó không quan trọng lắm. Tôi chỉ tò mò thôi.

+2

Đó là * không * tối ưu hóa. Dưới cùng của http://stackoverflow.com/questions/10065287/why-is-ushort-system-uint16-ushort-equal-to-int-system-int32/10157517#10157517 –

+0

Ngay cả với một 'ushort', chúng tôi muốn đang lãng phí hai bit hàng đầu ... – AakashM

Trả lời

4

Do đó, một nhóm (System.UInt16) là quá đủ để lưu trữ giá trị và chiếm một nửa không gian.

Bạn nghĩ "không gian" bị lãng phí ở đâu? DateTime không lưu trữ từng thành phần trong một trường riêng biệt. Nếu bạn lưu trữ năm một nơi nào đó, cảm thấy tự do để bỏ nó vào một ushort - và đúc Month đến một byte vv

Lưu ý rằng ushort không CLS-compliant, mà có lẽ là lý do cho nó . Có thuộc tính có ý nghĩa không được ký, chẳng hạn như string.Length v.v ... nhưng khung cố gắng tuân thủ CLS ở nơi có thể.

0
  • đơn vị trả về một Unsigned 16-bit số nguyên
  • Int trả về một số nguyên 32-bit.

Tôi giả định rằng trình biên dịch JIT tận dụng kiến ​​trúc CPU và do đó xử lý ở 32 bit sẽ hiệu quả hơn 16bit. Tôi tin rằng có một cuộc tranh luận tương tự với VB6 khi sử dụng Integers vs Longs (Bytes được phân bổ so với Architecture Speed).

http://blogs.msdn.com/b/davidnotario/archive/2005/08/15/451845.aspx

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