Cra*_*ket 1 c# asp.net stack-overflow
我有一个ASP.NET用户控件,其中有一个我用来隐藏和显示内容的面板,即
<asp:Panel runat="server" ID=pnlContainer">
<!-- Some fairly uninteresting content -->
</asp:Panel>
Run Code Online (Sandbox Code Playgroud)
我有一个可见的属性作为重写者,也就是说,
public override bool Visible
{
get { return pnlContainer.Visible; }
set { pnlContainer.Visible = value; }
}
Run Code Online (Sandbox Code Playgroud)
当我设置它时,我得到一个堆栈溢出异常但是当我将关键字改为时new,即
public new bool Visible
{
get { return pnlContainer.Visible; }
set { pnlContainer.Visible = value; }
}
Run Code Online (Sandbox Code Playgroud)
一切正常.为什么是这样?我想我对这些关键词的了解程度普遍不高,而且在这里显示出来.
也:
如果我没有打开任何关键字 - Visual Studio会发出警告,说明应该使用new或override关键字,因为我正在屏蔽用户控件上已存在的成员.
在某种程度上,我使用面板控制用户控件上的可见性的奇怪做法不是问题.在贡献者的帮助下,它显然是疯了,不应该这样做.但令我感兴趣的问题是,关键字override和new关键字以不同的方式表现,原因就在于此.
Microsoft页面了解何时使用覆盖和新关键字(C#编程指南)总结了不同之处.
查看那里指出的代码部分.它也列在下面:
public static void TestCars2()
{
Car[] cars = new Car[3];
cars[0] = new Car();
cars[1] = new ConvertibleCar();
cars[2] = new Minivan();
}
foreach (Car vehicle in cars)
{
System.Console.WriteLine("Car object: " + vehicle.GetType());
vehicle.DescribeCar();
System.Console.WriteLine("----------");
}
Run Code Online (Sandbox Code Playgroud)
同样的原则也适用于您的来源..NET框架将页面上的所有控件视为基本Control类的集合.Control.Visible是一个虚拟财产.
这意味着:当ASP.NET框架调用Control.Visible所有控件时,Control.Visible从源代码调用的唯一属性是标记为的属性override,这是人们通常认为的标准多态性.否则,如果new在ASP.NET框架调用时声明您的属性,Control.Visible则永远不会调用您的属性.
因此,覆盖会导致堆栈溢出异常,因为您正在调用您的panel.Visible,这是递归调用自身多次.