【问题解决】无法创建新的堆栈防护页面
【問(wèn)題發(fā)現(xiàn)】
? ? ? 項(xiàng)目中需要幾個(gè)自定義的控件,菜鳥D定義了一個(gè)接口,打算使用多態(tài)來(lái)統(tǒng)一調(diào)用。在完成兩個(gè)自定義控件后,項(xiàng)目都能正常運(yùn)行。但是在第三個(gè)控件使用的時(shí)候就出了問(wèn)題:將控件拖到界面上以后,不能拖動(dòng)改變控件的寬度,一拖動(dòng)就會(huì)出現(xiàn)“無(wú)法創(chuàng)建新的堆棧防護(hù)頁(yè)面”的提示,然后vs直接崩潰。后來(lái)經(jīng)過(guò)多次嘗試,發(fā)現(xiàn)可以輸入改變控件的寬度,但是依然會(huì)有崩潰發(fā)生。
【問(wèn)題解決】
? ? ? 菜鳥D在網(wǎng)上搜索相關(guān)的解決辦法,但是幾乎所有的回答都在說(shuō)是遞歸調(diào)用導(dǎo)致溢出。菜鳥D發(fā)現(xiàn)自己的程序中有遞歸的調(diào)用,但是前兩個(gè)控件也是調(diào)用的這一個(gè)遞歸方法,如果是方法本身的問(wèn)題,那兩種控件也一定會(huì)出錯(cuò),但事實(shí)是那兩種控件可以正常使用的。所以問(wèn)題一定就在新的自定義控件上。
? ? ? 由于崩潰是在改變控件的寬度后發(fā)生的,必須看看寬度的屬性,以下是部分代碼:
public int Width {get { return this.Width; }set { Width = value;//此處自定義控件內(nèi)部的控件的location的設(shè)置,如:lable1.location=new Piont(); //為了實(shí)現(xiàn)一個(gè)聯(lián)動(dòng)的效果
}}
? ? ? 這時(shí)菜鳥D注意到代碼左側(cè)的提示:
? ? ? Recursive call 不就是遞歸么!!!原來(lái)如此,是這里的遞歸導(dǎo)致了崩潰。刪掉這段代碼后,控件隨意拖拉也再?zèng)]出現(xiàn)那樣的錯(cuò)誤了。問(wèn)題到此已經(jīng)得到了解決。
【問(wèn)題的分析】
? ? ? 菜鳥D不明白為什么這么寫會(huì)造成遞歸,于是開(kāi)始接下來(lái)的查找。
? ? ?在get里面的Width上用F12,發(fā)現(xiàn)光標(biāo)只是向上跳了一行,這個(gè)好像不對(duì),感覺(jué)有點(diǎn)怪。隨即想到既然這是自定義控件,繼承Control控件類,控件類里面會(huì)不會(huì)做了相應(yīng)的封裝。于是,轉(zhuǎn)到定義,以下代碼展示繼承關(guān)系:
public partial class ExControlBox : UserControl, IControlCommonablepublic class UserControl : ContainerControlpublic class ContainerControl : ScrollableControl, IContainerControlpublic class ScrollableControl : Control, IComponent, IDisposablepublic class Control : Component, IDropTarget, ISynchronizeInvoke, IWin32Window, IBindableComponent, IComponent, IDisposable // Control基類中的兩個(gè)屬性 public int Width { get; set; } public virtual string Text { get; set; }? ? ? 果然在Control基類里找到Width屬性,當(dāng)看到Text屬性時(shí)想起曾經(jīng)使用過(guò)override重寫過(guò)Text屬性,那是否可以換一種寫法“重寫”Width屬性?當(dāng)然可以——new。New 作為運(yùn)算符用于創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù),作為修飾符用于隱藏基類中被繼承的成員(出自msdn)。
于是改造了原來(lái)的Width屬性的寫法,也能成功運(yùn)行沒(méi)有發(fā)生崩潰。代碼如下:
new public int Width{get { return base.Width; }set{base.Width = value;//此處自定義控件內(nèi)部的控件的location的設(shè)置,如:lable1.location=new Piont(); //為了實(shí)現(xiàn)一個(gè)聯(lián)動(dòng)的效果 }}總結(jié):
1.在定義屬性時(shí),應(yīng)注意是否該屬性已經(jīng)存在于基類,如果存在,就需要判斷是需要重寫該屬性,還是隱藏該屬性。
2.遞歸的調(diào)用一定要謹(jǐn)慎,否則可能造成溢出,導(dǎo)致崩潰。?
菜鳥D希望這篇文章對(duì)您有所幫助。
轉(zhuǎn)載于:https://www.cnblogs.com/cnDqf/p/4083383.html
總結(jié)
以上是生活随笔為你收集整理的【问题解决】无法创建新的堆栈防护页面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决三星手机EditText背景色的问题
- 下一篇: html知识收集(一)