【問題發現】
專案中需要幾個自定義的控制項,菜鳥d定義了乙個介面,打算使用多型來統一呼叫。在完成兩個自定義控制項後,專案都能正常執行。但是在第三個控制項使用的時候就出了問題:將控制項拖到介面上以後,不能拖動改變控制項的寬度,一拖動就會出現「無法建立新的堆疊防護頁面」的提示,然後vs直接崩潰。後來經過多次嘗試,發現可以輸入改變控制項的寬度,但是依然會有崩潰發生。
【問題解決】
菜鳥d在網上搜尋相關的解決辦法,但是幾乎所有的回答都在說是遞迴呼叫導致溢位。菜鳥d發現自己的程式中有遞迴的呼叫,但是前兩個控制項也是呼叫的這乙個遞迴方法,如果是方法本身的問題,那兩種控制項也一定會出錯,但事實是那兩種控制項可以正常使用的。所以問題一定就在新的自定義控制項上。
由於崩潰是在改變控制項的寬度後發生的,必須看看寬度的屬性,以下是部分**:
recursive call 不就是遞迴麼!!!原來如此,是這裡的遞迴導致了崩潰。刪掉這段**後,控制項隨意拖拉也再沒出現那樣的錯誤了。問題到此已經得到了解決。
【問題的分析】
菜鳥d不明白為什麼這麼寫會造成遞迴,於是開始接下來的查詢。
在get裡面的width上用f12,發現游標只是向上跳了一行,這個好像不對,感覺有點怪。隨即想到既然這是自定義控制項,繼承control控制項類,控制項類裡面會不會做了相應的封裝。於是,轉到定義,以下**展示繼承關係:
public果然在control基類裡找到width屬性,當看到text屬性時想起曾經使用過override重寫過text屬性,那是否可以換一種寫法「重寫」width屬性?當然可以——new。new 作為運算子用於建立物件和呼叫建構函式,作為修飾符用於隱藏基類中被繼承的成員(出自msdn)。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
public
virtual
string text
於是改造了原來的width屬性的寫法,也能成功執行沒有發生崩潰。**如下:
new總結:public
intwidth
set }
1.在定義屬性時,應注意是否該屬性已經存在於基類,如果存在,就需要判斷是需要重寫該屬性,還是隱藏該屬性。
2.遞迴的呼叫一定要謹慎,否則可能造成溢位,導致崩潰。
菜鳥d希望這篇文章對您有所幫助。
標籤:
無法建立新的堆疊防護頁面,
遞迴溢位,
堆疊異常
問題解決 無法載入MYSQL擴充套件,請檢查PHP配置
phpmyadmin 無法載入 mysql 擴充套件,請檢查 php配置 的解決方法 在配置了php的執行環境,並且安裝了mysql資料庫之後,下面就可以學習下php如何與mysql進行互動了。既然mysql是資料庫,則必不可少的需要建立資料庫 表 欄位等操作 假象下我們使用asp access的情...
無法掛載cdrom的問題解決
一直停留在gcc應用程式設計,今天進入板子實踐,需要進入光碟機安裝,mount mnt cdrom 命令提示 mount can t find mnt cdrom in etc fstable or etc mtab google下,發現有類似的問題,解決方案如下,不過它不適合我,這裡貼過來供需要的...
mysq無法輸入中文的問題解決
二.永久解決辦法 第一次遇到docker安裝mysql 連線後死活無法輸入中文,下面是解決辦法 root 9b8431717d87 locale a cc.utf 8 posix root 9b8431717d87 exit 容器系統內預設使用的是posix字符集,而posix字符集是不支援中文的 ...