没有好坏之分,一般是变量在哪个范围用就在哪定义,只在if里用就不要定义在if外面,只在Page_Load里用就不要定义成类变量。。。尽量缩短变量生命周期。
但有时候为了便于编码和阅读,如会把在if里用的定义在if外面。
能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?
@pengjw:
简单说在哪个括号里定义的就只能在它里面用,不能跑到它外面的其它方法或代码里用。
你上面说的a=3是不能在其它方法用的。
位置1定义的是类变量,在整个类中都能用,对应aspx前台也是这个类的一部分,只不过要是public或protected才能在前台<%%>里访问。
public partial class DA_GBRMZT : DetailBasePage
{
protected void Page_Load(object sender, EventArgs e)
{ 位置1
if (!IsPostBack)
{位置2
if (linkType == "Copy")
{ hidSaved.Value = "0"; }
else
{ hidSaved.Value = "1";}
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
}
protected void btnCopy_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
this.hidSaved.Value = "0";
}
}
如上:<input type="hidden" id="hidSaved">
当我把if(!IsPostBack)里的hidSaved的value属性赋值移到位置1的话,下面在btnCopy()方法里的this.hidSaved.Value="0"是不起作用的。也就是在位置1处给hidSaved.value赋值的话,后面的方法都没法改变了。而在位置2的话,后面的两个方法改value属性值都能成功。
不知道我说清楚没?
位置1:整个类都可以访问, 改变变量前的修饰符还可以改变访问范围
位置2和3:局部于大括号内
能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?
@pengjw: 网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?
在位置1如果不是私有的,aspx文件中可以用<%%>访问。
如果是方法里面的变量也要根据修饰符,要弄清private,public等修饰符
public partial class DA_GBRMZT : DetailBasePage
{
protected void Page_Load(object sender, EventArgs e)
{ 位置1
if (!IsPostBack)
{位置2
if (linkType == "Copy")
{ hidSaved.Value = "0"; }
else
{ hidSaved.Value = "1";}
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
}
protected void btnCopy_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
this.hidSaved.Value = "0";
}
}
如上:<input type="hidden" id="hidSaved">
当我把if(!IsPostBack)里的hidSaved的value属性赋值移到位置1的话,下面在btnCopy()方法里的this.hidSaved.Value="0"是不起作用的。也就是在位置1处给hidSaved.value赋值的话,后面的方法都没法改变了。而在位置2的话,后面的两个方法改value属性值都能成功。
不知道我说清楚没?
作用域不同,代表了垃圾回收的时间不同,全局变量,是在类销毁时销毁,局部变量,使用完时就被垃圾回收机制去处理掉了。
能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?
@pengjw: 变量1是当前页面的前后台都可以使用,变量2在当前方法中可以使用,变量3在当前的判断内可以使用,if(!IsPostBack){}中可以使用三个变量, protected void Page_Load方法中可以使用变量1和2
注:必须是三个变量,而不是变量1在这三个地方改变值
public partial class DA_GBRMZT : DetailBasePage
{
protected void Page_Load(object sender, EventArgs e)
{ 位置1
if (!IsPostBack)
{位置2
if (linkType == "Copy")
{ hidSaved.Value = "0"; }
else
{ hidSaved.Value = "1";}
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
}
protected void btnCopy_Click(object sender, EventArgs e)
{
if (hidSaved.Value == "1")
{
wjModel.WJID = id;
dal.Update(model);
}
else
{
dal.Add(model);
hidSaved.Value = "1";
}
this.hidSaved.Value = "0";
}
}
如上:<input type="hidden" id="hidSaved">
当我把if(!IsPostBack)里的hidSaved的value属性赋值移到位置1的话,下面在btnCopy()方法里的this.hidSaved.Value="0"是不起作用的。也就是在位置1处给hidSaved.value赋值的话,后面的方法都没法改变了。而在位置2的话,后面的两个方法改value属性值都能成功。
不知道我说清楚没?
@pengjw: ++你看看asp.net中为什么要加 if (!IsPostBack)这句话
举个例子:
就把三个变量比作三个有效期不一样的超市抵用券,当年(1),当月(2),当星期(3),这是作用域方面的考虑
放在你的空间有限的衬衫口袋里,一年的,你就得放你口袋里一年,丢了就没了,这是内存方面的考虑。
当你在有效期内需要使用抵用券去购物的时候,你得拿着抵用券原件(ref或者引用类型)去消费,如果拿着抵用券的复印件去干嘛是不会改变本身的抵用券的状态的。
当web请求结束的时候,可以看成你凭空消失了,只活在别人的记忆中了,看不见摸不着,然后记忆就会被抹去,GC就干这事。
呵呵,不错