我可以以任何有意义的方式使用bool*
。我将如何转换bool*
为byte
例如,或储存在bool*
一个字节C#中bool *的用途
我的目标是管理我的项目我的记忆中,具体细节并不重要,只是一些ID喜欢做的事。现在我想能够存储我自己的变量,并且我碰巧需要存储一个布尔值。我如何使用unsafe
和byte*
来存储这个布尔值,并最大限度地利用我的空间?理想情况下在字节中存储4位。
我可以以任何有意义的方式使用bool*
。我将如何转换bool*
为byte
例如,或储存在bool*
一个字节C#中bool *的用途
我的目标是管理我的项目我的记忆中,具体细节并不重要,只是一些ID喜欢做的事。现在我想能够存储我自己的变量,并且我碰巧需要存储一个布尔值。我如何使用unsafe
和byte*
来存储这个布尔值,并最大限度地利用我的空间?理想情况下在字节中存储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的指针)转换为其他类型的问题只能转换为四个字节的整数或其他数据类型。提示:使用标志可以最大限度地利用空间:这会使枚举类型对每个标志占用一点,这会为每个字节提供八个布尔值。
注意,'myptraddress'应该是32b系统的'uint'和64b系统的'ulong'。 'mybool'应该位于'unsafe'块之外的'fixed'语句中。 – 2010-07-11 11:54:10
@Jaroslav:好点。处理不安全的代码还有很多要说的。我想举一个小例子,'int'确实是一个糟糕的选择(但不一定是错误的)。请注意,当变量是值类型并在堆栈上初始化时,不需要'fixed'。 – Abel 2010-07-11 12:23:25
你可以用代码编写,你想要做什么? – 2010-07-11 10:26:17
我宁愿简写为'Nullable'或'bool?'。指针在不安全的代码中就像那样使用。如果你想使用通用约定转换,使用'byte b =(someBool?(byte)1:(byte)0);' –
2010-07-11 10:26:22
只是出于好奇,但你为什么要管理自己对整个想法的记忆C#是*不管理你自己的内存*?考虑在.NET中使用C++,很容易做到,并且拥有所有你想要的自由,包括管理你的内存。 – Abel 2010-07-11 10:50:36