相信很多人在写项目的时候会构建一个继承于System.Web.UI.Page的类,将很多的公用部分代码放入其中,如权限检测、出错处理(方便嘛)等,但是在构建这样一个类的时候有一个问题是需要特别注意,就是类的属性定义,我们来看下面这个属性<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
public
Hashtable EffectSecurityChecker
{
set
{
Application[“aa”] = value;
}
get
{
if ( Application[“aa”] == null)
{
Application[“aa”] = new Hashtable();
}
try
{
return (Hashtable)Application[“aa”];
}
catch
{
Application[“aa”] = new Hashtable();
return (Hashtable)Application[“aa”];
}
}
}
{
set
{
Application[“aa”] = value;
}
get
{
if ( Application[“aa”] == null)
{
Application[“aa”] = new Hashtable();
}
try
{
return (Hashtable)Application[“aa”];
}
catch
{
Application[“aa”] = new Hashtable();
return (Hashtable)Application[“aa”];
}
}
}
乍一看好像没什么问题,连出错处理都做好了,而且编译也可以成功通过。但其忽略了一点,这个基础页面类是一个界面类,什么问题?界面类被继承后其属性会被子类初始化,当我们的子类继承了这个类后它自己的
private
Hashtable _EffectSecurityChecker
=
null
;
public Hashtable GetEffectChecker()
{
if ( Application[“aa”] == null)
{
Application[“aa”] = new Hashtable();
}
try
{
return (Hashtable)Application[“aa”];
}
catch
{
Application[“aa”] = new Hashtable();
return (Hashtable)Application[“aa”];
}
}
public Hashtable GetEffectChecker()
{
if ( Application[“aa”] == null)
{
Application[“aa”] = new Hashtable();
}
try
{
return (Hashtable)Application[“aa”];
}
catch
{
Application[“aa”] = new Hashtable();
return (Hashtable)Application[“aa”];
}
}
所有子类通过GetEffectChecker()方法来进行调用,因为方法不影响界面初始化,所以子类的web界面依然可以正常编辑。
有一点需要强调一下,第一种做法不会影响程序的运行。