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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李拴同 中级黑马   /  2012-12-22 16:48  /  3011 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李拴同 于 2012-12-26 11:11 编辑

看了视频 看到字段和属性  总感觉理解的不清楚做了如下总结 各位看看对不对 或者补充一些他们的区别以及用法
属性 开头大写
                          public int Age
                             {
                                set{}
                                get{}
                              }
字段 开头小些public int age
字段好处 判断用户输入的和法制而属性不可以判断
属性的用法 class Person5
             {
                private int age
                public int Age
                   {
                      set{this.age=value}
                       get{return this.age}  
                    }
              }
千万不可  this.Age  reture this.Age 因为字段不存数据 会变成死循环

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

14 个回复

倒序浏览
我是初学.net的,对于你这个问题,我今天刚刚看过视频,我觉得C#之所以这样处理字段,就像C++中,基本上类的成员变量(相当于这里的字段)都是私有的,方法一般是公有的,为了防止成员变量被无意修改或者非法操作及访问,通过成员函数来进行保护操作,其实道理是一样的,不知道能不能帮助你

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报

可以理解为字段是类内部用的,属性是类外部用的。

下面是个C#写的例子,这个例子作用是可以通过属性获取时间值,但是只能通过SetTime()方法设定时间值,我想这也是为什么要分字段和属性的一大原因吧。

  首先声明的是private类型的变量(字段)hours,通常字段写法都是加个"_"符号,然后声明只读属性hours。

  在类内部可以通过变量(字段)对其进行读写,在类外部不能访问变量(字段),只能访问属性。而且在此例内如果想修改时间值,只能通过调用SetTime()方法往里传值(因为这里的各属性只有get没有set,只在类内部的SetTime()方法中对其对应字段进行赋值操作),而不能通过类实例对象timeTest1的 timeTest1.hours=12 这样进行赋值。
public class TimeTest
{
    private int _hours;
    public int hours
    {
        get { return _hours; }
    }

    private int _minutes;
    public int minutes
    {
        get { return _minutes; }
    }

    //可以不加"private",C#中类成员默认都是private类型的
    int _seconds;
    public int seconds
    {
        get { return _seconds; }
    }

    public void SetTime(int hours, int minutes, int seconds)
    {
        this._hours = hours;
        this._minutes = minutes;
        this._seconds = seconds;
    }
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
属性可以理解为是对字段的封装,程序员可以对字段进行有规则的赋值。
本人是这样理解的。。。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
简单的说属性可以设置是否读写,可以通过(set)属性给内部字段赋值和加上自己的逻辑判断等限制,通过(get)属性取值,用一句话总结就是
属性适合和外部交互使用,字段是在程序内部使用,是隐藏的

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
个人理解,属性是对字段的封装,这样比较安全,在类的外部通过属性给字段赋值。个人理解可能有错呵呵

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
属性是对字段的封装,提高了程序的安全性,在类的外部再通过属性给字段赋值。也可以不设字段,直接用简单属性的方式。都可以。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
苏波 高级黑马 2012-12-23 11:33:08
8#
字段是用来存放值的,而属性按照一定的规则来取得值,然后放在字段中,可以说属性是字段的升级

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
属性只局限于类中方法的声明,并不与类中其他成员相关。例如:
void setA(String s){}
String getA(){}
当一个类中拥有这样一对方法时,我们可以说,这个类中拥有一个可读写的a属性(注意是小写a)。如果去掉了set的方法,则是可读属性,反之亦然。

类成员(字段),通常是在类中定义的类成员变量,例如:
public class A{
private String s = "123";
}
我们可以说A类中有一个成员变量叫做s。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
字段用来表示与类和对象相关联的数据,当我们在类中需要计算的时候需要添加字段。
属性用来表示类的状态。当我们需要描述对象状态的特征时要再类中添加属性。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
管冉 中级黑马 2012-12-25 00:49:59
11#
属性理解起来运用起来还是需要点时间来掌握的。
字段的话,直接定义是在类里面方法外面的变量,当有静态方法时,不能调用非静态字段,其他情况,都可以直接把字段看成类里面的一个变量来看,

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
private int age;定义的叫做字段,
public void setAge();方法中的Age叫做属性
平时我们都认为字段属性没多大区别,都这么叫,有时是属性,有时叫字段,心里明白就好

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
rla540 中级黑马 2012-12-25 14:01:22
13#
      其实属性就是一种变形的方法!我查看了属性的反汇编代码,和我自己写的同功能的方法,结果发现,两个的反汇编代码基本一模一样的。可以使用方法能解决了,为什么不搞出来属性这个东西呢?我想可能是因为,属性看起来和字段很“像”----直观。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
哦 谢谢大家了学习了
回复 使用道具 举报
属性可以对设值、取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然
一般情况下get 读取的值就是set 设置的值,但是可以让get 读取的值不是set 设置的值的,极端的例子。Public
Age{get{return 100;}set{}}。加分的补充回答:用reflector 反编译可以看出,属性内部本质上就是set_***、get_***
方法,详细参考传智播客.net 培训视频中串讲.net 基础的部分。
class Person
{
public int Age
{
get
{
return 3;
}
set
{
}
}
}
Person p1 = new Person();
p1.Age = 30;
p1.Age++;
Console.Write(p1.Age);//输出3

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

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