读书人

在C#里怎么取得用new创建的对象指针

发布时间: 2012-04-02 19:58:59 作者: rapoo

在C#里如何取得用new创建的对象指针?
使用unsafe之后可以在代码里使用指针,但我却没找到把指针指向new来的对象的办法,这样就没法使用动态数据结构了。

比如像这样写的代码,根本没法通过编译:

C# code
Node* p = new Node();


这个有办法解决吗?

[解决办法]
http://wenku.baidu.com/view/f4ab201959eef8c75fbfb3c8.html

楼主看看这个
[解决办法]
即使用链表,也不需要使用指针的,何况你是对象存储,更不适合使用指针,在.NET中,指针是必须用fixed关键字,或者GCHandle.Alloc方法固定后才能使用的,否则就报错,因为GC随时会清理内存,一旦清理,你上次获得的指针地址就会改变,导致程序异常,这在.NET里面是不安全的,因此编译器直接不让你通过。
指针一般是用来处理短时间的操作,临时将内存地址固定,你的链表存储在.NET里面绝对不适合用指针。
[解决办法]
给你一段直接获取对象字节的方法和直接从字节转为对象的方法,和C++兼容,可以直接把C++转成的字节转换为对象(对象必须固定长度)。你可以从中看下指针是如何在.NET里面使用的。
C# code
        public static unsafe byte[] GetBytes<T>(object obj)        {            byte[] arr = new byte[Marshal.SizeOf(obj)];            GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);            void* pVer = handle.AddrOfPinnedObject().ToPointer();            fixed (byte* parr = arr)            {                *parr = *(byte*)pVer;            }            handle.Free();            return arr;        }        public static unsafe T GetObject<T>(byte[] bytes) where T : new()        {            T rect = new T();            GCHandle handle = GCHandle.Alloc(rect, GCHandleType.Pinned);            void* pVer = handle.AddrOfPinnedObject().ToPointer();            fixed (byte* b = bytes)            {                *(byte*)pVer = *b;            }            handle.Free();            return rect;        }
[解决办法]
你用结构做节点的话,会是复制的方式,但是用类做节点就不会复制了。

Node* p = new Node();
Node是个结构吗?那应该这样写:
Node node; 或者Node node = new Node();
Node*p = &node;

对类的实例不能用&取地址。

[解决办法]
你用类就不要用指针了。
C#的指针不适合你这种场合。

C# code
public class Node    {        public string Value { get; set; }        public Node Next;    } 

读书人网 >C#

热点推荐