प्रश्नोत्तरी: निम्न प्रोग्राम प्रिंट क्या करता है?स्ट्रक्चरलाइट पैक = 1 बूल के साथ काम नहीं करता है?
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication2 {
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct1 {
bool b;
int i;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct2 {
byte b;
int i;
}
class Program {
static void Main(string[] args) {
Console.WriteLine(Marshal.SizeOf(typeof(Struct1)));
Console.WriteLine(Marshal.SizeOf(typeof(Struct2)));
Console.ReadKey();
}
}
}
उत्तर:
8
5
यह मेरे लिए बहुत भ्रामक है। बूल और बाइट दोनों के पास 1 बाइट का आकार होता है, और [StructLayout(LayoutKind.Sequential, Pack=1)]
निर्दिष्ट करने से किसी भी पैडिंग मुद्दे को रद्द करना चाहिए। दोनों structs 5 बाइट होना चाहिए। तो मेरे पास दो प्रश्न हैं:
- मार्शलिंग इस तरह से क्यों काम करता है?
- कोई कामकाज? मेरे पास देशी structs में 1-बाइट बूलियन हैं जिन्हें मुझे आयात करने की आवश्यकता है। मैं निश्चित रूप से बाइट का उपयोग कर सकता हूं लेकिन यह "गन्दा" है।
धन्यवाद।
यह एक चमकदार माइक्रोसॉफ्ट-आईएसएम है: बूल सी और सी ++ में 1 बाइट है। यह कभी मेरे लिए कभी नहीं हुआ होगा कि वे माइक्रोसॉफ्ट-विशिष्ट टाइपपीफ के लिए मार्शल करेंगे। – Asik
बूलियन सी में केवल पूर्णांक हैं (कम से कम प्री-सी 99)। केवल सी ++ में मूल 'बूल' प्रकार होता है। 'Int' का उपयोग करके इंटरऑपरेबिलिटी के लिए बूलियन बेहतर है, क्योंकि यह अधिक आम है। – SztupY