当前位置:编程学习 > C#/ASP.NET >>

求助,关于局部变量生存期的问题!


代码如下:
void SubSocket::excuteMessage(String^ msg){
XmlDocument^ xml=gcnew XmlDocument(); 
xml->LoadXml(msg);//这里获得的xml文档是正常的
String^ xmlName=xml->DocumentElement->Name;
String^ messageType;
if(xmlName=="policy-file-request"){
String^ str;
str= "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"2008\" /></cross-domain-

policy>";
//str=readPolicyFile(url);
this->Send(str);
return;
}
if(xmlName=="command"){
doCommand(xml);
}
}

bool SubSocket::doCommand( XmlDocument^ xml){
String^ command;
String^ parament;
command=xml->DocumentElement->Attributes->GetNamedItem("name")->Value;//程序到这里出现空引用异常
parament=xml->DocumentElement->Attributes->GetNamedItem("paramater")->Value;
//更多代码
return true;
}

在excuteMessage函数内部定义了XmlDocument^ 类型的变量xml,xmlName读取也是正确的,程序运行到doCommand函数内部时出错。
调试程序,在进入doCommand德时候,参数xml还是可以查看到正常的值,可是一到,command=xml->DocumentElement->Attributes->GetNamedItem("name")->Value;这条语句,就出现空对象引用错误(System.NullReferenceException)。
这实在是太奇怪了。xml在excuteMessage内部定义,而doCommand也在doCommand内部调用,照理来说都在xml变量的生存期,为何到了doCommand,对xml的引用就失效了呢?
敢问朋友们这个问题怎么解决?
--------------------编程问答-------------------- up --------------------编程问答-------------------- 自己顶! --------------------编程问答-------------------- 这个问题已经解决了,是我自己不小心造成的。XML数据中没有name属性,所以。。。。。sorry~~
现在遇到的一个新的问题是这样的,我使用了.NET Framework托管的类XmlDocument和String。
可是似乎托管的代码都只能是引用类型的。
例如我在类的头文件中作如下声明:
gcroot<String^> groupName;
gcroot<XmlDocument^> playerData;
这个时候,我发现,在任何函数中赋值字符串或者创建XmlDocument类,这个函数结束的时候,这个字符串或者类的就不存在了。有办法创建它们的永久引用吗?就是说groupName和playerData所指的对象的生存期怎么才能与其所在的类的生存期一样长? --------------------编程问答-------------------- 这个问题更新为:如果用.NET Framework托管类String和XmlDocument,在自定义类中保存数据!因为他们都是引用类型,所以似乎无法在类定义中实例化,而在类的任何一个函数中实例化,在退出这个函数的时候对它们的引用也就失效了!
如何解决这个问题,使得String和XmlDocument对象在自定义类的整个生存周期内都有效?!! --------------------编程问答-------------------- 不懂,up
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,