C#中的指针问题。

lifeixie 2005-06-10 04:42:41
下面代码用了指针,可是抱出两个错误。
错误如下。
G:\NETLightX\DataProcess\ReceiveData32.cs(21): 无法获取托管类型(“NETLightX.DataProcess.ReceiveData32.my”)的变量地址或大小
G:\NETLightX\DataProcess\ReceiveData32.cs(21): 只能获取固定语句初始值设定项内的未固定表达式的地址
我在编译器里的设置里面选了允许不安全代码,而且又选了允许不安全代码调试,应该没有什么可以在设置的吧,可是为什么编译的时候就抱错了???。为什么说我那个结果是托管类型。我都加unsafe 了,不安全代码也加了,倒低错在什么地方,不管定向不定向,编译应都编译不过去啊。请高手指教!!!!!!!!!!!!!!!
using System;

namespace NETLightX.DataProcess
{
/// <summary>
/// ReceiveData32 的摘要说明。
/// </summary>
public unsafe class ReceiveData32 : IDisposable
{
unsafe struct my
{
unsafe string a;
}
my MYs = new my();
//My = &MYs;
public void aaa()
{
my *My = &MYs;
}
public ReceiveData32()
{
}
public void Dispose()
{
Dispose();
GC.SuppressFinalize(true); // as a service to those who might inherit from us
}
}
}
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzq686 2005-06-11
  • 打赏
  • 举报
回复
string属于.net托管资源。.net会自行回收的。
楼主估计是C++用多了。

如果使用非可管理性资源,在不使用这些资源后,必须明确地释放它。对资源的隐性控制是由Finalize方法(也被称为finalizer)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源。

finalizer应该只释放被销毁对象占用的非可管理性资源,而不应牵涉到其他对象。如果在程序中只使用了可管理性资源,那就无需也不应当执行Finalize方法,只有在非可管理性资源的处理中才会用到Finalize方法。由于finalizer需要占用一定的资源,因此应当只在需要它的方法中执行finalizer。

显性地调用finalizer是不允许的,它只能被碎片收集程序调用。如果希望尽快地释放一些不再使用的数量有限的非可管理性资源(如文件句柄),则应该使用IDisposable界面,这一界面有个Dispose方法,它能够帮你完成这个任务。Dispose是无需等待Finalize被调用而能够释放非可管理性资源的方法。

如果已经使用了Dispose方法,则应当阻止碎片收集程序再对相应的对象执行Finalize方法。为此,需要调用静态方法GC.SuppressFinalize,并将相应对象的指针传递给它作为参数,Finalize方法就能调用Dispose方法了。据此,我们能够得到如下的代码:

public void Dispose()
{
// 完成清理操作

// 通知GC不要再调用Finalize方法
GC.SuppressFinalize(this);
}

public override void Finalize()
{
Dispose();
base.Finalize();
}



epimetheus 2005-06-11
  • 打赏
  • 举报
回复
String不是非托管类型,所以不能对含有string型字段的结构体使用指针
lifeixie 2005-06-11
  • 打赏
  • 举报
回复
就酸 STRING 不行还是包错。应该怎么写才对。
lifeixie 2005-06-11
  • 打赏
  • 举报
回复
晕,看来不行么???安读路瞬,哥们。
mmqingfeng 2005-06-10
  • 打赏
  • 举报
回复
unsafe struct my
{
unsafe char* a;
}

my MYs = new my();

//My = &MYs;
public void aaa()
{
fixed(my *My = &MYs)
{

}
}
昨今明2017 2005-06-10
  • 打赏
  • 举报
回复
C#不持指针吧.有个ref引用 类型.
Ninputer 2005-06-10
  • 打赏
  • 举报
回复
String不是非托管类型,所以不能对含有string型字段的结构体使用指针
lifeixie 2005-06-10
  • 打赏
  • 举报
回复
ding

110,533

社区成员

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

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

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