Vì DateTime là cấu trúc với các thành viên xuất hiện để phân tích thành các giá trị toán học đơn giản, tôi không chắc chắn tại sao sử dụng sizeof() trên đó tạo ra thông báo trong tiêu đề câu hỏi..NET DateTime không có kích thước được xác định trước
Trả lời
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?
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".
Alex Pinsker đã viết nice solution để nhận kích thước DateTime
(hoặc bất kỳ loại nào khác).
- 1. Cách mở JFileChooser với kích thước được xác định trước
- 2. mảng chuỗi có kích thước không xác định
- 3. mảng tĩnh được xác định với kích thước không xác định, dấu ngoặc trống?
- 4. Có thể xác định kích thước tệp cần tải xuống?
- 5. Kích thước bước tự động MySQL được xác định là
- 6. cách xác định kích thước của không gian bảng 11g
- 7. Xác định kích thước của CCLabelTTF
- 8. Xác định C# Mã kích thước
- 9. Xác định kích thước chính xác trong loadView
- 10. Xác định kích thước của InputStream
- 11. Tìm giữa danh sách kích thước không xác định
- 12. Kích thước đối tượng .NET
- 13. .NET Kích thước bộ nhớ
- 14. có thể kích thước của mảng được xác định tại thời gian chạy trong c?
- 15. Xác định kích thước của cửa sổ WPF SizeToContent trước khi hiển thị
- 16. Xác định kích thước của viewState của trang ASP.NET trước khi phục vụ trang
- 17. Có giới hạn về kích thước đối với định dạng .NET Assembly không?
- 18. Xác định một mảng kép không có kích thước cố định?
- 19. Thay đổi kích thước hình ảnh jpeg thành kích thước được chỉ định
- 20. Cách xác định kích thước của đối tượng phức tạp trong .NET?
- 21. Looping một mảng kích thước cố định mà không cần xác định kích thước của nó trong C
- 22. Có cách nào để xác định kích thước của một vector STL lồng nhau C++ không?
- 23. Cách lấy khổ giấy được xác định trước bằng PaperKind
- 24. Mảng có kích thước xác định tại thời gian chạy, có hợp lệ trong C++ không?
- 25. Có cách nào tốt hơn để xác định kích thước phù hợp cho UITableViewCell không?
- 26. Xác định kích thước tệp hình ảnh + kích thước qua Javascript?
- 27. R xác định kích thước của khung dữ liệu trống
- 28. Cách xác định kích thước của chuỗi và nén nó
- 29. Trình bao bọc Fancybox không tự động định kích thước chính xác thành kích thước hình ảnh
- 30. MSVC's _M_X64 Xác định macro được xác định trước
Đã thêm trích dẫn từ msdn ... –
Cảm ơn :-) Đã thêm tham chiếu thứ hai – Yahia
Đ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). –