黑马程序员技术交流社区

标题: 属性,字段我给搞混了???? [打印本页]

作者: 郑丹丹1990    时间: 2013-4-19 19:03
标题: 属性,字段我给搞混了????
本帖最后由 郑丹丹1990 于 2013-4-24 08:57 编辑

class Person3
    {
        //字段
        private int age;
      // public int Age1;//public字段和属性的区别,可以进行非法设置值的判断
        //定义属性
        public int Age
        {
            get { return age; }
            set
            {
                if (value < 0)
                    return;
                this.age = value;
            }//value代表用户赋值的值
        }
    }
作者: ↖落葉下♀媃媚    时间: 2013-4-19 19:17
你不是写着呢吗?还有啥不清楚的
class Person3
     {
         //下面这两个都属于字段
        private int age;
       public int Age1;
        //这个是age的属性
        public int Age
         {
             get { return age; }
             set
             {
                 if (value < 0)
                     return;
                 this.age = value;
             }//value代表用户赋值的值
        }
     }
作者: kelline    时间: 2013-4-19 19:22
你没看其他语言的话, 应该很好理解的啊

字段  --->  变量

属性 ---> 可以给private 权限的私有字段赋值
作者: 张林杰    时间: 2013-4-19 19:23
属性就是类中如果定义了一个变量,这个变量用public 修饰,并且有get/set两个方法,我们就叫这个变量为属性
字段则是由相应的属性来进行保护的,一般由private修饰,因为我们把允许外部访问的变量(即字段)都声明为属性,
其实按我的理解,字段就是 不是属性 的变量。。或者说由private修饰的变量,因为最好不要把字段public
以你的代码说明:
  1.     class Person3
  2.     {
  3.         private int age; //这个变量age是字段,对应的属性是Age
  4.         public int Age1; //这个变量Age1也是字段,没有对应属性

  5.         public int Age   //这个Age是属性
  6.         {
  7.             get { return age; }
  8.             set
  9.             {
  10.                 if (value < 0)
  11.                     return;
  12.                 this.age = value;
  13.             }
  14.         }
  15.     }
复制代码
另外要注意的是,属性是可以没有对应字段的,因为到时编译器会自动生成相应字段,
比如简化的 public int Age{get;set;};
作者: 陈帅    时间: 2013-4-19 20:02
个人觉得 私有字段 写在外面比较好~~
作者: 张松    时间: 2013-4-19 20:35
一个完整的常规属性由以下几部分构成:
1:私有字段,用来存储变量(后备存储),这个字段之所以是私有的,是为了让它只能通过属性来赋值。
private string _sName;
2:一个get访问器,它负责读取数据,用于返回字段值或者是用于计算并返回字段值。以return或者是throw语句终止。其中可以包含些简单的逻辑处理,例如数据验证等等。
get
{
//电脑价格,如果小于零,则返回0,说明数据不正常
return _computerPrice >= 0 ? _computerPrice : 0;
}
3:一个set访问器,负责给属性赋值,类似于一个返回类型为void的方法,可以包含逻辑处理,例如可以根据默认的值通过计算后返回结果。
常规属性分类:
1:按访问修饰符来分:可将属性标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户如何才能访问属性。
2:属性还可以标记成,静态属性,实例属性,虚属性,抽象属性,需要注意的是,如果属性已经标记成静态(static ) 的,那么后面不能和虚(virtual),抽象(abstract),重写(override)混用。
3:同一属性如果只包含get访问器,我们称之为只读属性,如果只包含set访问器,叫可写属性,如果即有get, 又有set访问器,我们叫可读可写属性。
什么是自动实现的属性?
当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明变得更加简洁。当您如下面的示例所示声明属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访问器进行访问。
public string sName
{
get;
set;
}
自动实现属性和常规属性的区别:

1:自动实现的属性必须同时声明 get 和 set 访问器。若要创建 readonly 自动实现属性,请给予它 private set 访问器。
2:自动实现的属性 (Property) 不允许具有属性 (Attribute)。如果您必须在属性 (Property) 的后备字段上使用属性 (Attribute),则应该只创建常规属性 (Property)。
3:从自动实现属性的定义来看,可以发现在get,和set中不能包含特殊的逻辑处理。这点从功能上讲有点类似字段的作用,但和字段又有区别。
什么是字段,这里不用多说,这里讲下字段和属性的区别:
1:字段在值的处理上并不是那么的灵活,给它赋什么它就是什么,不允许经过逻辑处理。如果把一个人的身高写成一个字段,给它赋值1000M,这显示是不正常的数据,字段无法处理这种特殊数据。
2:与字段不同,属性不作为变量来分类。因此,不能将属性作为 ref参数或 out参数传递。
常规属性,自动实现属性和字段都各有特点:
1:常规属性功能最全,灵活必也最强。
2:自动实现属性较常规属性代码简洁,但灵活性不够(get,set访问器中不能包含逻辑代码)。在数据的存储和读取上功能和字段相同。
3:字段,代码最少,但灵活性最差。如果字段在赋值和取值时并无逻辑处理,可以选择字段。字段结合方法的使用可以和常规属性功能相比。

作者: 王德钊    时间: 2013-4-19 21:19
有人回答了,我就补充一点点,就是使用字段和属性的问题。通俗的说,一般小写的这个是字段,大写的这个是属性(一般写法),在本类里,在使用时是使用字段,而在类外使用时就要使用大写的属性。更通俗的讲,小写的处理自己的事情,对外一切都交给大写的吧
作者: 高文咪    时间: 2013-4-19 21:23
字段是用来赋值的,属性是用来描述的
作者: 郑丹丹1990    时间: 2013-4-19 22:03
kelline 发表于 2013-4-19 19:22
你没看其他语言的话, 应该很好理解的啊

字段  --->  变量

person:字段可以定义有name,age,gender
属性有name,age,gender
真不知道具体是何区别?
作者: 郑丹丹1990    时间: 2013-4-19 22:07
属性是类提供给外部调用时用,的可以使用 对象.属性 设置或读取 一个值
get{reture xxx;}表示可读
set{xxx = value;}表示可写

字段就是类内部用的.存储数据
作者: kelline    时间: 2013-4-19 23:47
郑丹丹1990 发表于 2013-4-19 22:03
person:字段可以定义有name,age,gender
属性有name,age,gender
真不知道具体是何区别? ...

属性的主要作用就是对私有的字段进行赋值, 另外 属性的写法是开头字母大写Name ,Age

作者: 高文咪    时间: 2013-4-22 14:15
高文咪 发表于 2013-4-19 21:23
字段是用来赋值的,属性是用来描述的

呵呵,深的理解不了,只能用自己的方式去理解!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2