在C#里如何取得用new创建的对象指针?

muyi66 2012-03-28 04:28:57
使用unsafe之后可以在代码里使用指针,但我却没找到把指针指向new来的对象的办法,这样就没法使用动态数据结构了。

比如像这样写的代码,根本没法通过编译:
Node* p = new Node();


这个有办法解决吗?
...全文
676 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ktei2008 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

引用 25 楼 的回复:

你用类就不要用指针了。
C#的指针不适合你这种场合。

C# code


public class Node
{
public string Value { get; set; }

public Node Next;
}
谢谢,我想我是在做梦,又试了好多方式都无法绕过C#的安全设置。

过分要求高运行效率的情况下的确不适合使用C#……
[/Quote]

You chose a wrong tool. Why not use C++
muyi66 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

你用类就不要用指针了。
C#的指针不适合你这种场合。

C# code


public class Node
{
public string Value { get; set; }

public Node Next;
}
[/Quote]谢谢,我想我是在做梦,又试了好多方式都无法绕过C#的安全设置。

过分要求高运行效率的情况下的确不适合使用C#,它本来就不是为此而生的。
muyi66 2012-03-29
  • 打赏
  • 举报
回复
......我很高调?触动你们了?嘎嘎
sjhcsdn 2012-03-29
  • 打赏
  • 举报
回复
楼主一知半解,用类写个链表 都不会,还这么高调
soaringbird 2012-03-29
  • 打赏
  • 举报
回复
你用类就不要用指针了。
C#的指针不适合你这种场合。



public class Node
{
public string Value { get; set; }

public Node Next;
}
muyi66 2012-03-29
  • 打赏
  • 举报
回复
不行,无法声明指向托管类型的指针,而class定义的给了unsafe还是被托管的。
muyi66 2012-03-29
  • 打赏
  • 举报
回复
谢谢了,我不知道结构和类还有这样的差别,所以把NOde直接写成了结构。

如果用:
Node node; 或者Node node = new Node();
Node*p = &node;
这样的方式的话,有可能被内存回收破坏掉吧?因为生成控制表和使用控制标的是在不同的方法里。

我去试试对象看看
soaringbird 2012-03-29
  • 打赏
  • 举报
回复
你用结构做节点的话,会是复制的方式,但是用类做节点就不会复制了。

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

对类的实例不能用&取地址。
muyi66 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 的回复:]
You chose a wrong tool. Why not use C++
[/Quote]只是因为那个程序本来就是用C#写的,我想看看还能不能进一步提高效率。
muyi66 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

即使用链表,也不需要使用指针的,何况你是对象存储,更不适合使用指针,在.NET中,指针是必须用fixed关键字,或者GCHandle.Alloc方法固定后才能使用的,否则就报错,因为GC随时会清理内存,一旦清理,你上次获得的指针地址就会改变,导致程序异常,这在.NET里面是不安全的,因此编译器直接不让你通过。
指针一般是用来处理短时间的操作,临时将内存地址固定,你的链表存储在.NET里面绝对不……
[/Quote]非常感谢这些代码!

如果不使用指针的话,好像链表的变更是用复制节点的方式?那样效率又低了。
yyz985 2012-03-28
  • 打赏
  • 举报
回复
List<Node[]>
kkzhangyu 2012-03-28
  • 打赏
  • 举报
回复
想楼上的学习了
qldsrx 2012-03-28
  • 打赏
  • 举报
回复
给你一段直接获取对象字节的方法和直接从字节转为对象的方法,和C++兼容,可以直接把C++转成的字节转换为对象(对象必须固定长度)。你可以从中看下指针是如何在.NET里面使用的。

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;
}
qldsrx 2012-03-28
  • 打赏
  • 举报
回复
即使用链表,也不需要使用指针的,何况你是对象存储,更不适合使用指针,在.NET中,指针是必须用fixed关键字,或者GCHandle.Alloc方法固定后才能使用的,否则就报错,因为GC随时会清理内存,一旦清理,你上次获得的指针地址就会改变,导致程序异常,这在.NET里面是不安全的,因此编译器直接不让你通过。
指针一般是用来处理短时间的操作,临时将内存地址固定,你的链表存储在.NET里面绝对不适合用指针。
muyi66 2012-03-28
  • 打赏
  • 举报
回复
不是,一维的数组并不慢,而二维的就慢很多。我想是因为里面使用了乘法指令的缘故。

如果改用链表,我就可以避开乘法指令了。
cheng2005 2012-03-28
  • 打赏
  • 举报
回复
如果二维数组还是感觉慢的话,那你换别的方法也不太会有本质提升。你想自己写一个结构比数组还快,这本身已经很难了。
muyi66 2012-03-28
  • 打赏
  • 举报
回复
这些东西太慢,我需要最快的速度。原本只是一个控制递归用的二维数组,结果发现对二维数组的访问太慢,所以想改用链表数组。
色拉油 2012-03-28
  • 打赏
  • 举报
回复
直接用List泛型不就行了。。。。。。。。
yyz985 2012-03-28
  • 打赏
  • 举报
回复
List<Node> nodes
muyi66 2012-03-28
  • 打赏
  • 举报
回复
我想要一个动态链表数组
加载更多回复(10)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧