日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/11/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【问题解决】无法创建新的堆栈防护页面 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。