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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马郭 中级黑马   /  2013-12-30 22:42  /  3790 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马郭 于 2014-1-1 12:39 编辑

字段是表征类的特征的变量,是公有的
属性,是私有的,不允许外界随便改动
那他们之间有什么样的区别跟联系?
请指正……

评分

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

查看全部评分

7 个回复

倒序浏览
本帖最后由 卖火柴 于 2013-12-30 22:55 编辑

C#中属性和字段(变量)的区别
相同点:
都是类的成员,属性是类的属性,而字段是类色数据成员
----------------------------------------------------
不同点:
1 属性可进行数据绑定
2 属性可通过set和get方法进行数据安全性检验,而字段不行
3 属性可进行线程同步
public string Name
{
     set{
        lock(this)
        {
        }
     }
}
4 属性可以是抽象的,而字段不行
5 属性可以接口的形式表现
6 基于属性的索引
7 不要直接把字段转化为属性
实力与对象:类实例化的过程就是创建一个对象,也就是说实例就是对象;
字段:类内部用来存储数据
属性:类提供给外部调用时用的可以设置或读取一个值
变量:int double bool 等声明的都是变量
常量:前面多个 const
成员变量:在类中定义的变量
局部变量:在方法中定义的变量

字段变量就是对象公布出来和外界交互数据的变量。
属性是对一个或多个变量的包装。
在Java环境中,属性是通过从对象中暴露出来的Set方法和Get来实现的:
public boolean SetPublicString(string val){this.mPublicString = val;}
public string GetPublicString(){return this.mPublicString;}
而在DotNet当中,总结了以上的Set和Get方法,直接将其定义成了一个暴露属性,通过对这个属性的访问方式不同(取值还是赋值)而采用不同的代码如以下所示的get代码段和set代码段
变量的定义
public string mPublicString;
属性的定义
        public string PublicString{
            get{return this.mPublicString;}
            set{this.mPublicString = value;}
          }
因为可以做到使用不同的代码段,所以在访问的时候可以使用更多的逻辑控制来取到或限制需要的值:
public string PublicString{
  get{
    if(this.mPublicString.Length>10){
      return this.mPublicString;
      }
    else{
      return "";
      }
    }
  set{
    this.mPublicString = value;
    }
}
以上代码的意思是如果访问PublicString时就去查看mPublicString的长度,如果大于10就返回否则就返回空字符串。
综上就把字段变量mPublicString包装了起来,并不是直接的面向对象的使用者,达到控制的目的。
属性的方法中还能写各种复杂的逻辑,因为属性中set或get的代码块等同于SetPublicString和GetPublicString的方法。
主要区别:
字段(field):与类或对象相关联的变量,一般访问域为private
属性(property):字段的封装,通过访问器(accessor)来进行读写操作,一般为public
一般字段的修饰符有:
静态字段:static A
只读字段:readonly A
一般属性的修饰符:
virtual
abstract
override
举例说明:
private System.Int32 _id;
public System.Int32 id
{
       get { return _id; }
       set { _id = value; }
}
_id就是字段,id就是属性
字段,field:   
   public    string    name;   
   
   属性,property:   
   private    string    _name;   
   public    string    name   
   {   
     get{return    _name;}   
     set{_name    =    value;}   
   }   
   
   只有变量没有成员变量,表示函数内部的临时变量
属性与成员变量类似,它们都提供数据存储,但属性的功能远比成员变量强大。属性由特殊方法访问。get    和    set    访问器允许在设置或检索属性之后验证属性值、执行其他代码或执行其他任务。
而get    和    set    访问器操作的便是字段
回复 使用道具 举报
字数限制,接上:

在C#中:
     域:      表示与对象或类相关联的变量,修饰符不论是不是public。(与字段类似)
    字段:   表示与对象或类相关联的变量。通常来讲修饰符是public的成员变量称为字段,而private更适合说是局部变量。(与域类似)
    属性:   表示域或字段的自然扩展,使得在保证封装性的基础上实现了访问私有成员的便捷性。

域表示与对象或类相关联的变量,声明格式如下:
attributes field-modifiers type variable-declarators;
    域的修饰符field-modifiers可以是:new、public、protected、internal、private、static、readonly。实际上,域相当于C++中的简单成员变量。在下面的代码中,类A包含了三个域:公有的X和Y,以及私有的z。
class A
{
public int x;
public string y;
private float z;
}
字段
    字段是与对象或类相关联的变量。  
    当一个字段声明中含有static修饰符时,由该声明引入的字段为静态字段(static   field)。它只标识了一个存储位置。不管创建了多少个类实例,静态字段都只会有一个副本。  
    当一个字段声明中不含有static修饰符时,由该声明引入的字段为实例字段(instance   field)。类的每个实例都包含了该类的所有实例字段的一个单独副本。  
   在下面的示例中,Color类的每个实例都有r,g,b实例字段的不同副本,但是Black,White,Red,Green和Blue等静态字段只有一个副本:  
public   class   Color  
{  
        public   static   readonly   Color   Black   =   new   Color(0,   0,   0);  
        public   static   readonly   Color   White   =   new   Color(255,   255,   255);  
        public   static   readonly   Color   Red   =   new   Color(255,   0,   0);  
        public   static   readonly   Color   Green   =   new   Color(0,   255,   0);  
        public   static   readonly   Color   Blue   =   new   Color(0,   0,   255);  
         
        private   byte   r,   g,   b;  
         
        public   Color(byte   r,   byte   g,   byte   b)   {  
              this.r   =   r;  
              this.g   =   g;  
              this.b   =   b;  
        }  
}  
    如示例所示,通过readonly修饰符声明只读字段。给readonly字段的赋值只能作为声明的组成部分出现,或者在同一类中的实例构造函数或静态构造函数中出现。
属性
    为了类的封装性,一般是把字段设为Private, 把属性设为公有来操作字段。  
    属性(property)是字段的自然扩展,两者都是具有关联类型的命名成员,而且访问字段和属性的语法是相同的。然而,属性与字段不同,不表示存储位置。相反,属性有访问器(accessor),这些访问器指定在它们的值被读取或写入时需执行的语句。

    属性的声明类似于字段,不同之处在于属性的声明以定界符{}之间的get访问器和/或set访问器结束,而不是分号。同时包含get访问器和set访问器的属性称为读写属性(read-write   property)。只具有get访问器的属性称为只读属性(read-only property)。只具有set访问器的属性称为只写属性(write-only property)。
  
    get访问器相当于一个具有属性类型返回值的无参数方法。除了作为赋值的目标外,当在表达式中引用属性时,会调用该属性的get访问器以计算该属性的值。
  
    set访问器相当于一个具有单个名为value的参数和无返回类型的方法。当一个属性作为赋值的目标,或者作为++或--运算符的操作数被引用时,就会调用set访问器,所传递的自变量将提供新值。
  
List类声明了两个属性Count和Capacity,依次是只读和只写的。下面是使用这些属性的示例:  
List   names   =   new   List();  
names.Capacity   =   100;                     //调用set访问器  
int   i   =   names.Count;                       //调用get访问器  
int   j   =   names.Capacity;               //调用get访问器  
    与字段和方法类似,对于实例属性和静态属性,C#两者都支持。静态属性是声明中具有static修饰符,而实例属性则没有。  
    属性的访问器可以是虚拟的。当属性声明中包含virtual,abstract,override修饰符时,它们将运用到属性访问器。
    来自MSDN中的内容:
属性与字段
属性与字段都可在对象中存储和检索信息。它们的相似性使得在给定情况下很难确定哪个是更好的编程选择。
在以下情况下使用属性过程:
   1. 需要控制设置或检索值的时间和方式时。
   2. 属性有定义完善的一组值需要进行验证时。
   3. 设置值导致对象的状态发生某些明显的变化(如 IsVisible 属性)。
   4. 设置属性会导致更改其他内部变量或其他属性的值时。
   5.必须先执行一组步骤,然后才能设置或检索属性时。
在以下情况下使用字段:
   1. 值为自验证类型时。例如,如果将 True 或 False 以外的值赋给 Boolean 变量,就会发生错误或自动数据转换。
   2. 在数据类型所支持范围内的任何值均有效时。Single 或 Double 类型的很多属性属于这种情况。
   3. 属性是 String 数据类型,且对于字符串的大小或值没有任何约束时
+
+
+
字段(域)
可以把字段理解为类级别的变量、常量,用以存储该类的实例的相关数据。
public class Date
{
    private int _year;
    private int _month;
    private int _day;
}
大多数情况下字段的访问修饰符均为 private,如果修饰符为 public,那么在类之外都可以访问该字段,但不建议这样做,应该通过属性或方法来访问类中的数据。
属性
属性将类中的数据暴露给类外。
public class Date
{
    private int _year;
    private int _month;
    private int _day;
   
    public int Year
    {
        get
        {
            return _year;
        }
        set
        {
            _year = value;
        }
    }
   
    public int Month
    {
        get
        {
            return _month;
        }
        private set
        {
            _month = value;
        }
    }

    public int Day
    {
        get
        {
            return _day;
        }
    }
}
回复 使用道具 举报
字数限制,接上:

我们给 Date 类定义了三个属性,分别为 Year、Month、
Day。get 中使用关键词 return,set 中使用关键词 value。
Year 可读可写属性。
Month 也是可读可写属性,但其写权限只限于类内部。
Day 是只读属性。
Date date = new Date();
date._year = 2008; //错误,_year 为 private
date.Yonth = 2008; //正确
date.Day = 3; //错误,Day 属性不可写
说明,上述这样设计一个日期类属性的读写可能是不合理的,我们这样做只是为了解释属性的具体用法。
再看一个例子。
public int PageSize
{
    get
    {
        return _pageSize;
    }
    set
    {
        if (value <= 0)
        {
            _pageSize = 20;
        }
        else
        {
            _pageSize = value;
        }
    }
}
这是一个分页类中的页大小属性,表示一页显示多少条记录。可以看到,我们在设置 PageSize 属性值时,如果值小于等于 0,则会以默认值 20 代替。
索引
public class MyClass
{
    public string this[int index]
    {
        get
        {
            return "X" + index.ToString();
        }
    }
}
使用
MyClass mc = new MyClass();
MessageBox.Show(mc[100]);
字段(域)
可以把字段理解为类级别的变量、常量,用以存储该类的实例的相关数据。
public class Date
{
    private int _year;
    private int _month;
    private int _day;
}
大多数情况下字段的访问修饰符均为 private,如果修饰符为 public,那么在类之外都可以访问该字段,但不建议这样做,应该通过属性或方法来访问类中的数据。
属性
属性将类中的数据暴露给类外。
public class Date
{
    private int _year;
    private int _month;
    private int _day;
   
    public int Year
    {
        get
        {
            return _year;
        }
        set
        {
            _year = value;
        }
    }
   
    public int Month
    {
        get
        {
            return _month;
        }
        private set
        {
            _month = value;
        }
    }

    public int Day
    {
        get
        {
            return _day;
        }
    }
}
我们给 Date 类定义了三个属性,分别为 Year、Month、
Day。get 中使用关键词 return,set 中使用关键词 value。
Year 可读可写属性。
Month 也是可读可写属性,但其写权限只限于类内部。
Day 是只读属性。
Date date = new Date();
date._year = 2008; //错误,_year 为 private
date.Yonth = 2008; //正确
date.Day = 3; //错误,Day 属性不可写
说明,上述这样设计一个日期类属性的读写可能是不合理的,我们这样做只是为了解释属性的具体用法。
再看一个例子。
public int PageSize
{
    get
    {
        return _pageSize;
    }
    set
    {
        if (value <= 0)
        {
            _pageSize = 20;
        }
        else
        {
            _pageSize = value;
        }
    }
}
这是一个分页类中的页大小属性,表示一页显示多少条记录。可以看到,我们在设置 PageSize 属性值时,如果值小于等于 0,则会以默认值 20 代替。
索引
public class MyClass
{
    public string this[int index]
    {
        get
        {
            return "X" + index.ToString();
        }
    }
}
使用
MyClass mc = new MyClass();
MessageBox.Show(mc[100]);

评分

参与人数 1技术分 +2 收起 理由
V_John + 2 很给力!

查看全部评分

回复 使用道具 举报
卖火柴 发表于 2013-12-30 22:58
字数限制,接上:

我们给 Date 类定义了三个属性,分别为 Year、Month、

哥们 能不能简短点 我本来就晕 看完岂不更晕……谢谢你的回复了……
回复 使用道具 举报
卖火柴 发表于 2013-12-30 22:58
字数限制,接上:

我们给 Date 类定义了三个属性,分别为 Year、Month、

我主要想知道 什么时候用属性?是不是就是当外部的人员要访问类时 要把类的字段写成属性?
回复 使用道具 举报
黑马郭 发表于 2013-12-31 12:45
我主要想知道 什么时候用属性?是不是就是当外部的人员要访问类时 要把类的字段写成属性? ...

属性就是定义人的特征的。比如 男人 18岁 高低胖瘦之类的。定义特征时候用。
回复 使用道具 举报
qly2046 中级黑马 2013-12-31 13:28:16
8#
就跟你说一句话:
字段占内存,属性不占内存!
字段是首相,有实权,属性是天皇,只是走秀!
赋值的都是字段,调用的都是属性!

评分

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

查看全部评分

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