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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

机器人 r1 = new 机器人();
            r1.Name = "小I";
类中
    class 机器人
    {
      
        public string Name
        {
            get;  set;
        }

        public int FullLevel { get; set; }
}
之前看视频不是说,属性不能保存值吗,是用字段来保存的,这样写,不定义字段,直接设置属性,赋的值存到哪里,有默认字段吗,如果有又是什么访问权限,{get;set;}简写的完整版能写出来吗,直接这样写,有点看不懂,欢迎解答,谢谢

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

9 个回复

倒序浏览
属性是可以保存值的....
你的代码写的是伪代码吗?
每个类有很多属性,但是每个实例的具体属性值有很多是不同的,所以不建议给属性赋值。
一般都是通过构造函数给具体实例的属性值进行赋值操作。
对于一个类的某个属性值是一样的。
比如人类对应的人有两只眼睛,
就把人类对应的eyesNum直接用final 修饰并赋值为2
希望对你有点小帮助
回复 使用道具 举报
每个类有很多属性,但是每个实例的具体属性值有很多是不同的,所以不建议给属性赋值。
一般都是通过构造函数给具体实例的属性值进行赋值操作。

我看视频的时候说属性不保存值,保存值的是字段,所谓的保存是有内存空间存放,属性没有内存空间吧,字段才有,属性的保存值是中间传递给字段的吧,还是有点不明吧,不过还是非常感谢
回复 使用道具 举报
可以通过微软中间语言反汇编工具ildasm.exe查看,我们可以发现当设置 public string Name{get;set;}时,编译工具会自动帮我们生成get_Name和set_Name字段,这就解释了为什么可以以省略字段直接给属性赋值了。
这个工具默认在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A目录下

ildasm.jpg (53.66 KB, 下载次数: 77)

ildasm.jpg

点评

大神啊  发表于 2013-4-5 19:22
回复 使用道具 举报
好的,知道了谢谢,原谅编译器帮我们写了
回复 使用道具 举报
这只不过是编译器给我们玩的花招,在编译器进行编译的时候,会给我们生成一个与之对应的private字段,而且简写的属性中,get和set编译器也会在编译的时候生成两个方法get()和set(string value)的方法,通过这两个方法来设置字段的值!
回复 使用道具 举报
本帖最后由 黑马田杰 于 2013-4-5 22:30 编辑

public string Name{set;get;}
是C#中语法糖,编译时还是会编译成:
private string _jk343jikjjf;  
public string Name
{
    set
    {
        _jk343jikjjf=value;
    }
    get
    {
        return _jk343jikjjf;
    }
}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
不设字段时  是自由属性, 自由属性和有字段的属性没有什么区别,自由属性在编译时编译器会自动保存,通过反编译工具就能看到反编译的代码见田杰的回复,其实和设置字段了的属性没什么区别,只是自由属性的get和set方法已经限制了
回复 使用道具 举报
黑马田杰 发表于 2013-4-5 22:28
public string Name{set;get;}
是C#中语法糖,编译时还是会编译成:
private string _jk343jikjjf;  

很强大,学习了
回复 使用道具 举报
如果有问题,可以继续提问,如果问题已经得到解决的话,可以将问题改为“已解决”,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马