首页 新闻 会员 周边 捐助

关于变量定义的位置的问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-11-02 11:17

public partial class DA_GBRMZT : DetailBasePage

  {     位置1

       protected void Page_Load(object sender, EventArgs e)

        {位置2

               if (!IsPostBack)

                   { 位置3 }

       }

 }

在上面三个位置定义变量,各自的好处和局限是什么呢?

pengjw的主页 pengjw | 初学一级 | 园豆:3
提问于:2012-10-19 10:12
< >
分享
最佳答案
0

没有好坏之分,一般是变量在哪个范围用就在哪定义,只在if里用就不要定义在if外面,只在Page_Load里用就不要定义成类变量。。。尽量缩短变量生命周期。

但有时候为了便于编码和阅读,如会把在if里用的定义在if外面。

收获园豆:8
向往-SONG | 老鸟四级 |园豆:4853 | 2012-10-19 10:30

能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?

pengjw | 园豆:3 (初学一级) | 2012-10-19 10:39

@pengjw: 

简单说在哪个括号里定义的就只能在它里面用,不能跑到它外面的其它方法或代码里用。

你上面说的a=3是不能在其它方法用的。

位置1定义的是类变量,在整个类中都能用,对应aspx前台也是这个类的一部分,只不过要是public或protected才能在前台<%%>里访问。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-19 10:50

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 | 园豆:3 (初学一级) | 2012-10-19 16:33
其他回答(3)
0

位置1:整个类都可以访问, 改变变量前的修饰符还可以改变访问范围

位置2和3:局部于大括号内

收获园豆:7
田林九村 | 园豆:2367 (老鸟四级) | 2012-10-19 10:22

能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?

支持(0) 反对(0) pengjw | 园豆:3 (初学一级) | 2012-10-19 10:37

@pengjw: 网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?

在位置1如果不是私有的,aspx文件中可以用<%%>访问。

如果是方法里面的变量也要根据修饰符,要弄清private,public等修饰符

支持(0) 反对(0) 田林九村 | 园豆:2367 (老鸟四级) | 2012-10-19 10:42

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属性值都能成功。

不知道我说清楚没?

支持(0) 反对(0) pengjw | 园豆:3 (初学一级) | 2012-10-19 16:33
0

作用域不同,代表了垃圾回收的时间不同,全局变量,是在类销毁时销毁,局部变量,使用完时就被垃圾回收机制去处理掉了。

收获园豆:2
az235 | 园豆:8483 (大侠五级) | 2012-10-19 10:39

能详细些吗?比如说在if(!IsPostBack){ 变量a=3 }里面定义的变量,我可以在别方法里改变。比如,在A方法里改变a=4的值,在方法B里是a的新值4,,而在上面的位置2定义的变量在整个pageload的大括号内都管用。还有,网友说在位置1的变量在当前页的前台、后台都能用,而位置1的变量只能在当前的后台用,这种理解对吗?

支持(0) 反对(0) pengjw | 园豆:3 (初学一级) | 2012-10-19 10:40

@pengjw: 变量1是当前页面的前后台都可以使用,变量2在当前方法中可以使用,变量3在当前的判断内可以使用,if(!IsPostBack){}中可以使用三个变量, protected void Page_Load方法中可以使用变量1和2

注:必须是三个变量,而不是变量1在这三个地方改变值

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-10-19 10:49

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属性值都能成功。

不知道我说清楚没?

支持(0) 反对(0) pengjw | 园豆:3 (初学一级) | 2012-10-19 16:32

@pengjw: ++你看看asp.net中为什么要加     if (!IsPostBack)这句话

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-10-19 16:38
0

举个例子:

就把三个变量比作三个有效期不一样的超市抵用券,当年(1),当月(2),当星期(3),这是作用域方面的考虑

放在你的空间有限的衬衫口袋里,一年的,你就得放你口袋里一年,丢了就没了,这是内存方面的考虑。

当你在有效期内需要使用抵用券去购物的时候,你得拿着抵用券原件(ref或者引用类型)去消费,如果拿着抵用券的复印件去干嘛是不会改变本身的抵用券的状态的。

当web请求结束的时候,可以看成你凭空消失了,只活在别人的记忆中了,看不见摸不着,然后记忆就会被抹去,GC就干这事。

 

收获园豆:3
Ethan轻叹 | 园豆:996 (小虾三级) | 2012-10-19 13:14

呵呵,不错

支持(0) 反对(0) pengjw | 园豆:3 (初学一级) | 2012-10-19 16:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册