A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贡宗新 中级黑马   /  2013-4-5 08:25  /  1979 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贡宗新 于 2013-4-11 12:16 编辑

Person5 p5=new Person5();
            p5.Age=30;
            Console.WriteLine(p5.Age);

class Person5
    {
        private int age;
        public int Age
        {
            set
            {
                this.Age = value;

            }
            get
            {
               
                return this.Age;    //死循环
            }
        }
    }

为什么在属性中,明明知道this.Age会出错,自动提示为什么会提示出错误的来呢,难道this.Age还有其它的作用,求解释???

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

7 个回复

倒序浏览
Console.WriteLine(p5.Age); 这句话错了
你的Person5中把Age给私有化了。
被private修饰的成员对外界是透明的,如果外界想访问被private修饰的成员。
必须通过Person5对外暴露的方法来获取

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
主要是想搞清楚 this.Age的作用 Age是属性的名字,this加属性名有什么意义呢,难道只是为了让我们出错
回复 使用道具 举报
本帖最后由 庞立森 于 2013-4-5 10:23 编辑

首先说你的代码错误太多,你要问的如下
其实在函数里面默认就有this.关键字,只是为什么这里面必须写呢?
因为你的属性的名字是age然后你的参数也是age,所以这里必须用this给予区分,
如果不加this而且都是同名,虚拟机不知道该给谁赋值,不知道你想要的是什么。
这时候就会出错。
this.age其实简单说就是你创建的对象(谁调用就是代表谁),在这里创建了一个P对象,所以代表的就是P
请参考下面的代码
class Person5
{
        private int age;
        Person5()//空构造函数
        {
        }
        Person5(int age)//有参数构造函数
        {
        this.age=age;
        }
        public static void setAge(int age)//因为age私有,所以必须对提供一个方法对年龄进行设置
        {
        this.age=age
        }
        public static int getAge()//对外提供一个获取年龄的方法
        {
        return age
        }

}
class Demo
{
        public static void main(String[] agers)
        {
                Person5 p=new Person5(15);//这个也可以穿件一个空参数的对象Person5 p=new Person5();
                //然后通过setAge()方法进行设置
                p.setAge(12);
                p.getAge();
        }

}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
这个问题好畸形啊!首先,编译器不报错是因为this.Age= value;编译时语法没有出错,
至于运行时报的“堆栈溢出”错误是因为this.Age指的就是Age属性,你在Age属性里一直给Age属性(this.Age)赋值,但是属性不能保存值,所以会出错。
给字段赋值就ok了,例如( this.age= value;或者age= value;)
回复 使用道具 举报
好吧,是我没把代码i写完整,其实这个不是讲构造函数的,而是在看杨老师讲的属性视频的时候,杨老师这么写的,问结果是什么样,很容易写错的一点就是自动提示偶尔会把this.age写出this.Age然后就造成死循环了,错误是堆栈溢出,就想知道 this.Age与this.age的区别

namespace 第一个类
{
    class Program
    {
        static void Main(string[] args)
        {                    
      

            Person5 p5=new Person5();
            p5.Age=30;
            Console.WriteLine(p5.Age);
            Console.ReadKey();

        }
    }

    class Person5
    {
        private int age;
        public int Age
        {
            set
            {
                this.Age = value;
                //this.age = value;     如果改成这句就对了
            
            }
            get
            {
                return this.Age;    //死循环
              // return this.age;  如果该成这句就对了
            }
        }
    }

}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
贡宗新 发表于 2013-4-5 10:55
好吧,是我没把代码i写完整,其实这个不是讲构造函数的,而是在看杨老师讲的属性视频的时候,杨老师这么写 ...

this指的是Person5这个类,那么this.Age不就是Age属性,this.age不就是age字段嘛
回复 使用道具 举报
本帖最后由 郑丹丹1990 于 2013-4-5 13:03 编辑

class person5
{
public int Age{get;set;}
}
person5 person=new person5();
person.Age=30;
您最好这样写。


或者
class Person
    {
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
      
    }

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马