در نوع های مدیریت نشده، برای بدست آوردن اندازه آن نوع بر حسب بایت استفاده می شود. نوع های مدیریت نشده شامل نوع های توکار (built-in) که در جدولی که بعدا" می آید لیست شده اند و همچنین نوع های زیر هستند:
- نوع های شمارشی (Enum types)
- نوع های اشاره گر (Pointer types)
- ساختارهای کاربر-تعریف که حاوی هیچ فیلد یا پراپرتی نوع مرجع نباشد
مثال زیر چگونگی بدست آوردن اندازه یک نوع int را نشان می دهد:
// Constant value 4: int intSize = sizeof(int);
ملاحظات
از نسخه 2.0 سی شارپ به بعد، اعمال sizeof روی نوع های توکار ، دیگر نیازی به استفاده از شیوه unsafe ندارد.
عملگر sizeof را نمی توان overload کرد. مقدار برگشتی توسط عملگر sizeof از نوع int است. جدول زیر مقادیر ثابتی که جایگزین عبارت sizeof با عملوندهای ورودی از نوع های خاص را نشان می دهد:
عبارت |
مقدار ثابت |
---|---|
sizeof(sbyte) |
1 |
sizeof(byte) |
1 |
sizeof(short) |
2 |
sizeof(ushort) |
2 |
sizeof(int) |
4 |
sizeof(uint) |
4 |
sizeof(long) |
8 |
sizeof(ulong) |
8 |
sizeof(char) |
2 (Unicode) |
sizeof(float) |
4 |
sizeof(double) |
8 |
sizeof(decimal) |
16 |
sizeof(bool) |
1 |
برای همه نوع های دیگر از جمله ساختارها، عملگر sizeof فقط می تواند در بلوک کد unsafe مورد استفاده قرار گیرد. هرچند شما می توانید از متد Marshal.SizeOf استفاده کنید، مقدار برگشتی توسط این متد همیشه با مقدار برگشتی توسط sizeof برابر نیست. Marshal.SizeOf بعد از اینکه نوع در حافظه سازماندهی شد، اندازه را برمی گرداند، درحالیکه sizeof به محظ اینکه نوع توسط زبان زمان اجرای عمومی (CLR) تخصیص داده شد، اندازه را با احتساب هرگونه padding (صفرهای پشت عدد که باعث می شوند عدد همواره اندازه یکسانی داشته باشد) برگشت می دهد.
مثال
class MainClass { // unsafe not required for primitive types static void Main() { Console.WriteLine("The size of short is {0}.", sizeof(short)); Console.WriteLine("The size of int is {0}.", sizeof(int)); Console.WriteLine("The size of long is {0}.", sizeof(long)); } } /* Output: The size of short is 2. The size of int is 4. The size of long is 8. */