黑马程序员技术交流社区

标题: 属性和字段的定义 [打印本页]

作者: 似鱼非鱼    时间: 2013-10-17 12:53
标题: 属性和字段的定义
private string name;中"name"为字段,
是不是用get/set封装起来就叫属性了?
作者: ╰┄轩、辕_ヤ    时间: 2013-10-17 13:25
public----成员可以有任何代码访问;
private----成员只能有类中的代码访问(如果没有使用任何关键字,默认使用这
个关键字);
internal----成员有定义他的项目(程序集)内部的代码访问;
protected----成员只能由类或派生类的代码访问。
后两个关键字可以合并
protected internal----他们只能由项目(程序集)中的派生代码来访问。
1.定义字段:
字段用标准的变量声明格式和前面介绍的修饰符来声明(也可以初始化),例如


class myClass
{
public int MyInt;
}

公共字段推荐用PascalCasing的形式来命名,私有字段没有推荐的命名形式,一
般使用camelCasing的形式来命名。
字段可以使用关键字readonly,表示这个字段只能在执行构造函数的过程中赋值
,或由初始化语句赋值,例如:

class myClass
{
public readonly int MyInt=17;
}
字段也可以使用static声明为静态的:

class myClass
{
public static int MyInt;
}

2.定义方法:

方法使用标准的函数格式,以及可访问性,和可选的static修饰符来声明,例如


class myClass
{
public string MyString()
{
return “这是一个方法”;
}
}
解析:

class myClass
{
//开始声明方法代码
public string MyString()
{
return “这是一个方法”;
}
//结束声明方法代码
}

公共方法也用PascalCasing的形式来命名。
注意:如果声明了static关键字,这个方法就只能通过类来访问,而不能通过对
象实例还访问。
也可以在方法定义中使用下面的关键字:
virtual----方法可以重写;
abstract----方法必须在非抽象的派生类中重写(只用于抽象类);
override----方法重写了一个基类方法(要重写方法,必须用这个关键字);
extern----方法定义在其他地方;

3.定义属性

属性定义与地段类似,但内容比较多。属性有两个类似于函数的块,一个用于获
取属性的值,一个用于设置属性的值,例子:

class myClass
{
private int myInt;//字段
//(下面为属性)
public int MyInt
{
get
{
return myInt;
}
set
{
myInt=value;
}
}
}

get 块一般有一个属性类型的返回值,简单的属性一般与一个私有字段相关联,
用来控制对这个字段的访问,这是get块可以直接返回该字段的值;
上面的myInt字段外部不能访问,只能通过属性来访问该字段。

set函数以类似的方式把一个值赋给字段,这里可以使用关键字value引用用户提
供的属性值;value值等于类型和属性相同的一个值,如果属性的类型和字段的
类型相同,就不用进行类型转换。

属性可以使用vartual、override和abstract关键字,但是不能将这几个关键字用
于字段。

作者: 面朝大海,春暖    时间: 2013-10-17 13:32
并不是字段被封装了就变成属性,而应该理解为这种封装、保护字段的方法叫做属性,微软只是给这种方法起了个名字叫属性而已。
作者: Liu阳    时间: 2013-10-17 15:55
如果满足下面几个条件,那么我们便可以大胆地使用公共字段:

1. 允许自由读写;

2. 取值范围只受数据类型约束而无其他任何特定限制;

3. 值的变动不需要引发类中其它任何成员的相应变化;

属性的使用条件则恰好跟变量相反,只要满足下面任何一个条件,就应该使用属性:

1. 要求字段只能读或者只能写;

2. 需要限制字段的取值范围;

3. 在改变一个字段的值的时候希望改变对象的其它一些状态;

属性的实质是方法,想上面的三条,你会发现属性有它的作用,对吧

作者: ˋ初°见    时间: 2013-10-17 16:31
private string name;
public string Name
{
      get { return name; }
      set { name = value; }
}
为name添加Name属性,是为了保护字段name,可以限制外界是否可以访问和赋值,并且可以添加赋值条件,get和set可以单独存在。
例:
set
{
      if(value!="")
      {
            name=value;
      }
}   //当值不为空时,才把值付给name
作者: 猫咪不吃糖    时间: 2013-10-17 16:36
字段可以看做内部使用的一个临时变量,给外部看这个东西是没有意义的。

属性是对象定义的一个有意义的数据,所以要用get/set让外界可以访问他。

其实都是一样的东西,他们的区别就是有没有展示给外部的意义,需要展示的就要提供接口。
作者: ィSlick    时间: 2013-10-17 17:57
属性(property)
-充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制(当然也可以通过对普通域加readonly关键字来实现。
-设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进行设置或访问。
-不能把属性作为引用类型或输出参数来进行传递。
-get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
-采用间接方式来访问对象的属性(间接调用get、set方法):对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。
-在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,又有get访问器,表明该属性是可读可写的。

属性是类提供给外部调用时用

字段就是类内部用的.存储数据
作者: 荣右铭    时间: 2013-10-17 19:42
get和set方法是属性的必要不充分条件,属性的本质是一种方法,用来代替 “将私有字段用公有方法进行读取和赋值” 这种设计模式,因为这样写的人实在太多了,微软就在C#中把这个方法封装一下,改名为属性,封装,就是用一种通用的模式隐藏起内部的细节,这个方法隐含一个value参数,用以接受赋值,get和set方法不一定都要有,如果这个字段是只读的,那就没有set,如下测试可以证明属性本质上是方法:
public string Name
{
      get { return Name; }
      set { Name = value; }
}
运行,程序抛出堆栈溢出的异常,意味着有一个方法不断的递归自己,就是“属性”Name
作者: 夏闯富    时间: 2013-10-17 20:50
属性是类成员,能提供灵活的机制来读取、编写或计算私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法
所以说:属性是一个操作字段的值的特殊方法(函数).
作者: 喜之郎果冻    时间: 2013-10-17 21:25
属性是类成员,能提供灵活的机制来读取、编写或计算私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。
所以说:属性是一个操作字段的值的特殊方法(函数).
作者: §風過無痕§    时间: 2013-10-18 10:19
属性提供了对私有字段的访问封装
作者: 张锟-i    时间: 2013-10-19 18:30
属性是不存储任何的实值,它是域的扩展(即我们通常说的成员变量等)
属性(property)
-充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制(当然也可以通过对普通域加readonly关键字来实现。
-设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进行设置或访问。
-不能把属性作为引用类型或输出参数来进行传递。
-get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
-采用间接方式来访问对象的属性(间接调用get、set方法):对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。
-在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,又有get访问器,表明该属性是可读可写的。

属性和字段的比较:属性不能使用ref/out 型参数    属性使用前必须赋值
属性使用前必须赋值,例如:

Time lunch;

lunch.Hour = 12;//错误,lunch没有初始化
上面说那么多其实就一句话,我感觉初学者 没必要那么深入研究属性和字段。
------------------------------------------------------------------------------------------------------
| 属性就是对字段的封装 ,使用get和set访问器来控制如何设置或返回字段值|
------------------------------------------------------------------------------------------------------
作者: 黑马-吕老师    时间: 2013-10-21 10:45
得到正确答案后,请把帖子设置为已解决,版主才会给你加分
作者: 黑马-吕老师    时间: 2013-10-21 10:46
得到正确答案后,请把帖子设置为已解决,版主才会给你加分
作者: 迷你卡卡    时间: 2013-10-22 15:06
将字段封装为属性,其实就是面向对象中封装这个特点的一个具体应用
因为我们在定义字段的时候,一般都会定义为私有的,private int _age;
但是要在类的外部是访问不到类中私有成员的,因此,通常就利用属性将字段封装起来
public int Age

   get{return this.Age;}
    set{this.Age=value;}

,这样在累的外部就可以通过属性访问到了,
顺便说下,字段和属性在定义时的一些注意点:
字段的访问修饰符一般都定义为私有的,并且字段的名称一般都会使用下划线开头,尽量都使用小写  例如  private string _name;
而在定义属性的时候,一般访问修饰符都使用public,并且尽量属性名首字母都使用大写,例如  public string Name{get;set}
这种写法也称之为自动属性,当写完字段后,按下快捷键Ctrl+R+E就会自动弹出,会有一个预览
希望能帮助你理解字段和属性
作者: 有你珍贵    时间: 2013-10-22 16:29
字段是用来存储数据的。属性是用来保护字段不被外来的随意修改。。。
作者: 追溯客    时间: 2013-10-23 09:16
如问题被解决,请及时把分类设为"已解决",黑马有你更精彩!

作者: 马晓平    时间: 2013-10-28 21:44
字段、方法和属性的概念区别:
        类的字段准确地说应该是类的数据成员,其定义是:用于存储类和类的实例相关数据的变量。
方法就是类的函数成员,是一个为实现类的某一个特定功能的函数。因此也称为类的方法。
       属性是一个代表类的实例或类中的一个数据项的函数成员。从定义可以看出,属性是类的一个函数成员或者说是方法。对类的属性的设定和获取可以用两个访问器set和get来实现。
       字段,方法和属性的定义的区别如下示例:
      class MyClass
      {
             //数据成员或者字段的定义
             public int iTemp = 10;
             private int iTestValue;
             //属性的定义
             public int MyValue
              {
                     set   //设定属性
                     {
                          iTestValue= value;
                     }
                     get    //从属性获取值
                     {
                        return iTestValue;
                      }
             }
            //方法的定义
            public void SetValue(ref int iValue)
             {
                  TheRealValue = iValue;
            }
             public int GetValue()
             {
                    return TheRealValue;
             }
      }
       从概念上可以区分字段和属性的区别,字段是一个用于存储数据的变量,属性是一个方法或者说是一个函数成员。
那么既然属性是一个方法,那么他和方法的区别是什么呢?
       从定义就可以看出来,属性其实本身就是方法。但既然把属性和方法定义成为两个概念,那么他们之间肯定有不同地地方。个人感觉,他们最大的区别首先是属性没有参数列表,而方法必须要有参数列表,哪怕没有参数,也要放一个空括号在那。其次,属性定义里要有set和get两个访问器,用于获得属性的值和设定属性的值。其余的地方没有发现不同之处,属性里也可以判定数据的合法性,和方法没有什么两样。
作者: 追溯客    时间: 2013-10-29 07:43

问题解决请将分类设为"已解决".黑马有你更精彩
作者: 李洋    时间: 2013-10-29 08:50
1。字段,方法,属性都可以叫做类的成员Member, 它们都需要定义访问级别;
2。访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的;
3。属性看似字段,不是字段,可以进行非法值控制,可以设置只读。
作者: 凌晨丶草未眠    时间: 2013-10-29 11:24
属性:定义成public,其他类也可调用
字段:一般定义成private,本类中使用
class Person
    {
        private int age;//字段

        public int Age//属性,ctrl+r+e
        {
            get { return age; }//读
            set {
//数据过滤
                if (value<0)
                {
                    new Exception("年龄不能为负数!");
                }
                else if (value>130)
                {
                    new Exception("年龄不正常!");
                }
                else
                {
                    age = value;
                }
            }//写
        }
        
    }
作者: 佟嘉豪    时间: 2013-10-30 14:54
属性为Public
字段为private
出现属性是为了封装字段,属性中自带的set和get方法,就是为在外面可以给字段赋值
并且,如果不写属性,编译器在编译时候,也会自动生成属性的中间代码的
这点可以通过反编译一个.exe的net程序看见。

作者: 奔跑的胖子    时间: 2013-10-30 18:08
可以简单记成,在类中,但是在方法外的叫字段
有get,set方法的叫属性
作者: zhangqiang    时间: 2013-11-6 14:34
通常将字段指定为private,在类的内部使用。
将属性指定为public,对类外部公开使用,通过get和st访问器对字段提供安全,有效范围的保护。
作者: flypig    时间: 2014-10-5 14:34
很好的,很好的
作者: 官方    时间: 2014-10-7 13:19
学习路过~~~~




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