【问题解决】无法创建新的堆栈防护页面
2014-11-08 14:21
330 查看
【问题发现】
项目中需要几个自定义的控件,菜鸟D定义了一个接口,打算使用多态来统一调用。在完成两个自定义控件后,项目都能正常运行。但是在第三个控件使用的时候就出了问题:将控件拖到界面上以后,不能拖动改变控件的宽度,一拖动就会出现“无法创建新的堆栈防护页面”的提示,然后vs直接崩溃。后来经过多次尝试,发现可以输入改变控件的宽度,但是依然会有崩溃发生。
【问题解决】
菜鸟D在网上搜索相关的解决办法,但是几乎所有的回答都在说是递归调用导致溢出。菜鸟D发现自己的程序中有递归的调用,但是前两个控件也是调用的这一个递归方法,如果是方法本身的问题,那两种控件也一定会出错,但事实是那两种控件可以正常使用的。所以问题一定就在新的自定义控件上。
由于崩溃是在改变控件的宽度后发生的,必须看看宽度的属性,以下是部分代码:
这时菜鸟D注意到代码左侧的提示:
Recursive call 不就是递归么!!!原来如此,是这里的递归导致了崩溃。删掉这段代码后,控件随意拖拉也再没出现那样的错误了。问题到此已经得到了解决。
【问题的分析】
菜鸟D不明白为什么这么写会造成递归,于是开始接下来的查找。
在get里面的Width上用F12,发现光标只是向上跳了一行,这个好像不对,感觉有点怪。随即想到既然这是自定义控件,继承Control控件类,控件类里面会不会做了相应的封装。于是,转到定义,以下代码展示继承关系:
果然在Control基类里找到Width属性,当看到Text属性时想起曾经使用过override重写过Text属性,那是否可以换一种写法“重写”Width属性?当然可以——new。New 作为运算符用于创建对象和调用构造函数,作为修饰符用于隐藏基类中被继承的成员(出自msdn)。
于是改造了原来的Width属性的写法,也能成功运行没有发生崩溃。代码如下:
总结:
1.在定义属性时,应注意是否该属性已经存在于基类,如果存在,就需要判断是需要重写该属性,还是隐藏该属性。
2.递归的调用一定要谨慎,否则可能造成溢出,导致崩溃。
菜鸟D希望这篇文章对您有所帮助。
项目中需要几个自定义的控件,菜鸟D定义了一个接口,打算使用多态来统一调用。在完成两个自定义控件后,项目都能正常运行。但是在第三个控件使用的时候就出了问题:将控件拖到界面上以后,不能拖动改变控件的宽度,一拖动就会出现“无法创建新的堆栈防护页面”的提示,然后vs直接崩溃。后来经过多次尝试,发现可以输入改变控件的宽度,但是依然会有崩溃发生。
【问题解决】
菜鸟D在网上搜索相关的解决办法,但是几乎所有的回答都在说是递归调用导致溢出。菜鸟D发现自己的程序中有递归的调用,但是前两个控件也是调用的这一个递归方法,如果是方法本身的问题,那两种控件也一定会出错,但事实是那两种控件可以正常使用的。所以问题一定就在新的自定义控件上。
由于崩溃是在改变控件的宽度后发生的,必须看看宽度的属性,以下是部分代码:
public int Width { get { return this.Width; } set { Width = value; //此处自定义控件内部的控件的location的设置,如:lable1.location=new Piont(); //为了实现一个联动的效果 } }
这时菜鸟D注意到代码左侧的提示:
Recursive call 不就是递归么!!!原来如此,是这里的递归导致了崩溃。删掉这段代码后,控件随意拖拉也再没出现那样的错误了。问题到此已经得到了解决。
【问题的分析】
菜鸟D不明白为什么这么写会造成递归,于是开始接下来的查找。
在get里面的Width上用F12,发现光标只是向上跳了一行,这个好像不对,感觉有点怪。随即想到既然这是自定义控件,继承Control控件类,控件类里面会不会做了相应的封装。于是,转到定义,以下代码展示继承关系:
public partial class ExControlBox : UserControl, IControlCommonable public class UserControl : ContainerControl public class ContainerControl : ScrollableControl, IContainerControl public class ScrollableControl : Control, IComponent, IDisposable public class Control : Component, IDropTarget, ISynchronizeInvoke, IWin32Window, IBindableComponent, IComponent, IDisposable // Control基类中的两个属性 public int Width { get; set; } public virtual string Text { get; set; }
果然在Control基类里找到Width属性,当看到Text属性时想起曾经使用过override重写过Text属性,那是否可以换一种写法“重写”Width属性?当然可以——new。New 作为运算符用于创建对象和调用构造函数,作为修饰符用于隐藏基类中被继承的成员(出自msdn)。
于是改造了原来的Width属性的写法,也能成功运行没有发生崩溃。代码如下:
new public int Width { get { return base.Width; } set { base.Width = value; //此处自定义控件内部的控件的location的设置,如:lable1.location=new Piont(); //为了实现一个联动的效果 } }
总结:
1.在定义属性时,应注意是否该属性已经存在于基类,如果存在,就需要判断是需要重写该属性,还是隐藏该属性。
2.递归的调用一定要谨慎,否则可能造成溢出,导致崩溃。
菜鸟D希望这篇文章对您有所帮助。
相关文章推荐
- 【问题解决】无法创建新的堆栈防护页面
- 无法创建新的堆栈防护页面的解决办法
- 无法创建堆栈的防护页面 解决方法
- 无法创建新的堆栈防护页面
- 无法创建新的堆栈防护页面
- ASP.NET 创建工程时:无法创建新的堆栈防护页面
- MySQL 5.1 无法创建、修改存储过程的解决(简单问题)
- "Visual studio .net 无法创建或打开应用程序" 问题的一个解决思路
- (转)VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- vs2008与IIS 7.0使用在vista上时出现的问题及解决方法(Internet Explorer 无法显示该页面)(VS2008: IE Cannot Display Web Page)
- VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- 解决solaris /home无法创建目录问题
- Web程序中利用web.config解决无法输出excel页面的问题
- 解决ajax加载的页面js无法找到的问题
- asp页面在VS.NET中无法打开的问题解决(转)
- 如何解决Silverlight集成到IIS无法显示页面问题
- 杀毒后出现“Automation服务器无法创建对象”问题的解决方法
- VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题
- VS2005 无法创建或打开“智能设备”项目的一个问题的解决方法