【问题解决】无法创建新的堆栈防护页面

【问题发现】

项目中需要几个自定义的控件,菜鸟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希望这篇文章对您有所帮助。

时间: 2024-11-17 15:33:40

【问题解决】无法创建新的堆栈防护页面的相关文章

Drupal8开发教程:模块开发——创建新页面

之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块添加新页面非常简单,使用 hook_menu 定义路径及回调函数返回要显示的结果即可.但 Drupal 8 却要麻烦很多,虽然也是定义路径,然后关联用于显示内容的函数,但却要在两个文件中分开进行.而且 Controller 文件还有目录结构要求,这些变化都需要慢慢来适应了. 除了上文中定义的 hello_wo

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以

administrator无法创建新用户的解决

操作系统win2003sp2,已经是administrator了,但是创建新用户时提示: 在计算机 SERVER-05 上创建用户 abc 时,出现了以下错误: 拒绝访问. 百思不得其解,搜遍google和百度都没对症解药. 然后打开事件查看器,发现创建用户时系统抛错如下: SAM 无法更改数据库.很可能是因为内存 或磁盘空间不足.SAM 数据库会被还原为先前状态. 最近的更改都会丢失.请检查可用磁盘空间 和页面文件大小设置的最大值. 搜了下SAM的相关知识,估摸着要么是文件被破坏,要么是权限不

如何安装Scrapy及创建新项目

今天给大家写了一个Scrapy入门教程,帮助大家安装Scrapy和创建新项目. 1. 首先需要安装如下软件 Python 2.7 lxml OpenSSL pip or easy_install 2. 安装必备软件 sudo apt-get install libevent-dev sudo apt-get install python-dev sudo apt-get install libxml2-dev sudo apt-get install libxslt1-dev sudo apt-

使用Visual Studio 创建新的Web Part项目

使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之一.它是平台构建的核心基块. 1. 管理员身份打开Visual Studio,新建空白SharePoint项目.命名WroxSPProject,点击确定.部署为场解决方案,点击完成. 2. 右击选择添加新项目Web Part,命名SimpleWebPart,点击添加. 3. 在进一步前进之前,点击生成----部署解决方案. 此时,你将发现VS添加了许多项目到解决方案中.例

如何在HiWork中创建新频道及加入已有频道

周四,下午,天气很热,空气火热地快要化了,注意防晒. 今天来说说在HiWork中如何创建新频道,或者加入已有频道,明天会介绍如何创建新的讨论组及邀请成员加入讨论组. 可能有人会问,频道和讨论组到底有什么区别呢? 频道是个公共的话题组,团队中的所有成员通过搜索都可主动加入任意频道,或由其他团队成员邀请加入.每个成员左边显示的频道都是已经加入的频道,没有加入的不显示. 讨论组是私密的话题组,只有参与者能看到.成员无法主动加入讨论组,只能由讨论组中的组员邀请才能加入.另外,讨论组中的消息具有私密性,只

[Swift通天遁地]九、拔剑吧-(7)创建旋转和弹性的页面切换效果

本文将演示使用第三方类库,创建旋转和弹性的页面切换效果. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'GuillotineMenu' 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双击打开项目文件[

vue-cli创建的项目,配置多页面的实现方法

vue官方提供的命令行工具vue-cli,能够快速搭建单页应用.默认一个页面入口index.html,那么,如果我们需要多页面该如何配置,实际上也不复杂 假设要新建的页面是rule,以下以rule为例 创建新的html页面 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE html> <html>     <head>         <meta charset="utf-8">    

hexo创建新文章的正确方法

起因 之前我一直是通过复制以前的文章的形式来创建一个新的文档,但是这一次似乎遇到了一些问题.我将文章写完之后,准备进行预览,输入hexo s命令.在预览页面却没有显示出新的文章,还是和之前的页面是一样的 分析 我是这样分析的: 1. 没有hexo clean清楚缓存 2. 没有生成新的静态文档 3. 文章生成错误 大专栏  hexo创建新文章的正确方法解决方法 重新hexo clean清楚缓存文件,然后再hexo g生成新的文件,再hexo s启动本地服务器 失败,还是没显示出新的文档,(由此说