2011-07-24 30 views

Trả lời

7

Bởi vì CLR chỉ có thể xác định kích thước trong thời gian chạy ... một trong những lý do cho điều này là "đệm" (nền tảng phụ thuộc) ...

Đối với tất cả các loại khác, bao gồm cấu trúc, sizeof toán tử có thể là chỉ được sử dụng trong các khối mã không an toàn. Mặc dù bạn có thể sử dụng phương thức Marshal.SizeOf, giá trị được trả về bằng phương pháp này không phải lúc nào cũng là giống như giá trị được trả về bởi sizeof. Marshal.SizeOf trả về kích thước sau khi loại đã được sắp xếp, trong khi sizeof trả về kích thước vì nó đã được phân bổ theo thời gian chạy ngôn ngữ chung, bao gồm bất kỳ phần đệm.

Ref.

cũng thấy How do I check the number of bytes consumed by a structure?

+1

Đã thêm trích dẫn từ msdn ... –

+0

Cảm ơn :-) Đã thêm tham chiếu thứ hai – Yahia

+0

Điều này cũng ngụ ý rằng 'sizeof (DateTime)' sẽ hoạt động tốt trong ngữ cảnh 'không an toàn' (xem câu trả lời mới của tôi). –

1

Các lỗi văn bản đầy đủ, bạn nhận được, là:

lỗi CS0233: 'System.DateTime' không có một kích thước được xác định trước, do đó sizeof chỉ có thể được sử dụng trong một bối cảnh không an toàn (xem xét sử dụng System.Runtime.InteropServices.Marshal.SizeOf)

Vì vậy, nếu bạn sử dụng unsafe ngữ cảnh (hãy chắc chắn để đi đến "Pr C# của dự án operties", 'Xây dựng' tab, và đặt một dấu kiểm trong 'Cho phép mã không an toàn' để làm cho các biên dịch dưới đây) nó hoạt động tốt:

static void Main() 
    { 
     int s; 
     unsafe 
     { 
      s = sizeof(DateTime); 
     } 
     Console.WriteLine(s); // writes 8 
    } 

Với từ khóa unsafe, sizeof() sẽ làm việc với tất cả enum loại và với tất cả các loại struct không có trường mẫu tham chiếu (và DateTime là cấu trúc không có thành viên loại tham chiếu, chắc chắn).

Nếu không có từ khóa unsafe, bạn không thể sử dụng sizeof. (Tuy nhiên, vì C# 2 bạn được phép sử dụng nó trên các loại được xác định trước như int và trên enum loại, nhưng không phải trên cấu trúc khác như DateTime, như bạn đã thấy.)


Lưu ý rằng DateTime struct là đặc biệt trong đó Marshal.SizeOf<DateTime>() (hoặc Marshal.SizeOf(typeof(DateTime)) trước phiên bản .NET 4.5.1 (2013)) sẽ ném một ngoại lệ. Điều này là do bố cục cấu trúc bất thường (cho một struct) "Tự động".

0

Alex Pinsker đã viết nice solution để nhận kích thước DateTime (hoặc bất kỳ loại nào khác).

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