2010-07-11 89 views
3

我可以以任何有意义的方式使用bool*。我将如何转换bool*byte例如,或储存在bool*一个字节C#中bool *的用途

我的目标是管理我的项目我的记忆中,具体细节并不重要,只是一些ID喜欢做的事。现在我想能够存储我自己的变量,并且我碰巧需要存储一个布尔值。我如何使用unsafebyte*来存储这个布尔值,并最大限度地利用我的空间?理想情况下在字节中存储4位。

+0

你可以用代码编写,你想要做什么? – 2010-07-11 10:26:17

+1

我宁愿简写为'Nullable '或'bool?'。指针在不安全的代码中就像那样使用。如果你想使用通用约定转换,使用'byte b =(someBool?(byte)1:(byte)0);' – 2010-07-11 10:26:22

+0

只是出于好奇,但你为什么要管理自己对整个想法的记忆C#是*不管理你自己的内存*?考虑在.NET中使用C++,很容易做到,并且拥有所有你想要的自由,包括管理你的内存。 – Abel 2010-07-11 10:50:36

回答

4

在C#中,你通常不会使用bool*,这是你只能在不安全的代码中使用的东西(它带来了很多其他东西,比如固定对象等等)。 A bool*将是一个指向布尔值的指针。指针长度为4个字节,不能无损地转换为字节。

你为什么要这样做,你在哪里遇到这个?通常情况下,在C#中使用指针不是一件容易的事情,除非你有一个非常明确的需求(即一个API调用,但你可以使用P/Invoke来解决)。

编辑:(因为您编辑您的Q)

下面的代码片段展示了如何获取一个布尔变量的地址,以及如何为该指针转换为int(转换为byte不可能的,我们需要四个字节)。

unsafe 
{ 
    // get pointer to boolean 
    bool* boolptr = &mybool;     

    // get the int ptr (not necessary though, but makes following easier) 
    int* intptr = (int*)boolptr; 

    // get value the pointer is pointing at 
    int myint = *intptr; 

    // get the address as a normal integer 
    int myptraddress = (int) intptr; 
} 

你说“理想地在一个字节中存储4位”。除非你有4位机器架构,否则我会强烈反对,因为它会使检索和存储布尔变得非常慢。但更重要的是:你在说C#而不是C++。 C#绑定到CLR,它声明一个布尔值被存储为一个字节,并且每个存储器地址在32位体系结构中都是四个字节,这意味着指针长度为四个字节。因此,将bool *(指向bool的指针)转换为其他类型的问题只能转换为四个字节的整数或其他数据类型。提示:使用标志可以最大限度地利用空间:这会使枚举类型对每个标志占用一点,这会为每个字节提供八个布尔值。

+0

注意,'myptraddress'应该是32b系统的'uint'和64b系统的'ulong'。 'mybool'应该位于'unsafe'块之外的'fixed'语句中。 – 2010-07-11 11:54:10

+0

@Jaroslav:好点。处理不安全的代码还有很多要说的。我想举一个小例子,'int'确实是一个糟糕的选择(但不一定是错误的)。请注意,当变量是值类型并在堆栈上初始化时,不需要'fixed'。 – Abel 2010-07-11 12:23:25