属性和字段的理解

属性和字段的理解

引自:http://wuzhiyuanbj.blog.163.com/blog/static/17470587020111022310311/

 

一.属性和字段的理解:

我们知道,类成员包括变量和方法。如果希望其他类能够访问成员变量的值,就必须定义成公有的,而将变量设为公有public,那这个成员变量的就可以被任意访问(包括修改,读取),这样不利于数据安全。 C#通过属性特性读取和写入字段(成员变量),而不直接直接读取和写入,以此来提供对类中字段的保护。属性可用于类内部封装字段。属性是C#面向对象技术中封装性的体现。

注意:字段就是类的成员变量,为配合属性而这样称呼的。

二.属性和字段的区别

属性是逻辑字段;属性是字段的扩展,源于字段;

属性并不占用实际的内存,字段占内存位置及空间。

属性可以被其它类访问,而大部分字段不能直接访问。

属性可以对接收的数据范围作限定,而字段不能。

属性与字段都可在对象中存储和检索信息。

在以下情况下使用属性过程: 
1. 需要控制设置或检索值的时间和方式时。
2. 属性有定义完善的一组值需要进行验证时。
3. 设置值导致对象的状态发生某些明显的变化(如 IsVisible 属性)。
4. 设置属性会导致更改其他内部变量或其他属性的值时。
5. 必须先执行一组步骤,然后才能设置或检索属性时。
在以下情况下使用字段: 
1. 值为自验证类型时。例如,如果将 True 或 False 以外的值赋给 Boolean 变量,就会发生错误或自动数据转换。
2. 在数据类型所支持范围内的任何值均有效时。Single 或 Double 类型的很多属性属于这种情况。
3. 属性是 String 数据类型,且对于字符串的大小或值没有任何约束时

总之,(也就是增加了数据的安全性)最直接的说:属性是被“外部使用”,字段是被“内部使用”。

引入属性的优点

1.维护私有字段(保证类的封装性)

2.可控制访问(只读/只写,确保赋值的正确性等)

3.不用注重细节(直接使用,不需要考虑复杂的处理代码)

什么情况下选择使用字段还是属性?

从例子中可看到属性其实就是对私有字段的读取和写入,以便做些公有字段无法完成的任务,他的使用方式和公有字段完全一样,所以可以理解成属性是为了满足对公有字段的特殊需求而产生的附属品。因而当我们选择使用属性还是使用字段时,主要看需求,如果不需设置访问权限、不需在赋值时检测值是否满足要求、不需要在赋值时修改对象其他一些状态等特殊的需求时,使用公有字段即可,否则就使用属性。

1. 如果类中的字段不被外界访问,仅在类的内部应用,那么就直接定义成字段

2. 如果类中的字段可能被外界访问并且操作,那么就将字段定义成属性

三.属性和字段的应用

1. 字段:

class Card

   private string Name;
}

2. 属性:

属性中包含两个模块:set和get,set模块负责属性的写入工作,get模块负责属性的读取工作。在两个模块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。

class Card
{
    private string name;
    public string Name
    {
        get { return this.name;}
        set { this.name=value;}
     }
}

例:

class Product   //商品类

{

//私有字段

private string _Pname;    //商品名称

private bool _IsNoEmperty;//是否有库存

private float _Price;     //商品单价

private int _PCount;      //商品数量

//属性:

//可读写

public string Pname

{

set { _Pname = value; }

get { return _Pname; }

}

//只读

public bool IsNoEmperty

{

get { return _IsNoEmperty; }

}

//可检测赋值是否正确

public float Price

{

set

{

if (value >= 0)

_Price = value;

else

throw new Exception("Price的赋值范围");

}

get

{

return _Price;

}

}

//赋值时更改其他状态

public int PCount

{

set

{

_PCount = value;

_IsNoEmperty = true;   //改变了_IsNoEmperty字段的值

}

get { return _PCount; }

}

public void Print()

{

Console.WriteLine("产品信息如下:");

Console.WriteLine("产品名称:{0}",_Pname);

Console.WriteLine("产品价格:{0}", _Price);

Console.WriteLine("库存数量:{0}", _PCount);

Console.ReadLine();

}

static void Main(string[] args)

{

Product P1=new Product();

P1.Pname="黑人牙膏(克)";

P1.Price=5;

P1.PCount=20;

P1.Print();

}

例:
//有个网站,每当有新用户注册的时候,我们需要记录这些用户的信息   
class User   
{   
    //姓名,性别   
    public string name;   
    public string sex;   
}   
//声明一个类去使用User类   
class Property   
{   
    static void Main()   
    {   
        //实例化一个User对象   
        User zs = new User();   
        //对其赋值   
        zs.name = "张三";   
        zs.sex = "男";   
        Console.WriteLine("姓名:" + zs.name + " 性别:" + zs.sex);   
    }   
}

通过编译执行,这段代码正常运行,但是仔细分析,就会发现:所有字段都是公有的,不利于字段的保护,只要实例化了这个类,都可以修改其中的值。如果性别输入了男女之外的字符,系统是不会识别的。比如把zs.sex = "男";改成zs.sex = "牛";。运行代码结果肯定张三的性别成牛了...这个时候就不合逻辑了。修改为:
class User   
{   
    public string name;   
    public string sex;   
    //SetSex方法   
    public void SetSex(string values)   
    {   
        if (values == "男" || values == "女")   
        {   
            sex = values;   
        }   
        else 
        {   
            Console.WriteLine("性别只能为“男”或“女”");   
        }   
    }   
}   
class Property   
{   
    static void Main()   
    {   
        User zs = new User();   
        zs.name = "张三";   
        //直接调用SetSex赋值   
        zs.SetSex("牛");   
        Console.WriteLine("姓名:" + zs.name + " 性别:" + zs.sex);   
    }   
}

SetSex这个方法乍一看还可以,但是不要忘记name和sex字段还是public属性,我们依然可以直接去调用它,或者说去修改它,一样可以把sex设为“牛”。给类的字段设置为public意味着破坏了类的封装,这样呢会存在潜在的危险。所以呢要设为private,这个时候就分别声明方法去读取和设置这2个字段,修改如下:

using System;   
class User   
{   
    //设为私有的   
    private string name;   
    private string sex;   
    //设置   
    public void SetName(string values)   
    {   
        name = values;   
    }   
    //读取   
    public string GetName()   
    {   
        return name;   
    }   
    public void SetSex(string values)   
    {   
        if (values == "男" || values == "女")   
        {   
            sex = values;   
        }   
        else 
        {   
            Console.WriteLine("性别只能为“男”或“女”");   
        }   
    }   
    public string GetSex()   
    {   
        return sex;   
    }   
}   
class Property   
{   
    static void Main()   
    {   
        User zs = new User();   
        zs.SetName("张三");   
        zs.SetSex("牛");   
        Console.WriteLine("姓名:" + zs.GetName() + " 性别:" + zs.GetSex());   
    }   
}

现在这个类的设计就比较合理了,我们看name和sex它们是private字段,也就是说在类的外部是不能访问的,这样呢就保证了它的安全性。当用户想给性别字段添加非法字段的时候,SetSex方法内会对这个添加的值进行判断,如果不为男或女,值就不会被添加。通过方法虽然解决了上面的问题,但是每创建一个对象,输入字段值时就必须调用上面方法。如果不知道,就无法调用。为了提高数据安全性,并且有效解决上面的问题,C#推出了属性。可以创建属性,将字段和属性封装在一起。通过属性可以像访问字段一样访问数据成员,实现数据的封装,避免使用非法数据赋值,保证数据完整性,同时类内部发生修改时,避免整个程序的修改

时间: 2024-11-09 03:23:00

属性和字段的理解的相关文章

属性和字段的区别和联系

问题:C#语法中针对类中数据成员的访问引见的属性和字段概念和C++相比,C++中只要属性(觉得相当于于C#中的字段),但是在运用C#过程中,假入本人要写一个类,包含几个数据成员(即字段)但是为了让外边能够访问还需求写对应的属性出来,岂不是有点费事?使用属性的优点是什么? 在C#中,我们可以非常自由的.毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋值于某个范围.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性

C#属性与字段

一.字段: 字段是储存类要满足其设计所需要的数据,是与类相关的变量. 二.属性: 1.在C#中可以自由的.毫无限制的访问公有字段,但在一些场合中,我们需要只能给字段赋于某个范围的值.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性. 2.属性有两个方法:get和set. get访问器返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用: set访问器没有显示设置参数,但它有一个隐式参数,用关键字value表示,

Java中属性和字段的区别 ,很多人都分不开吗.尤其是反射技术之上的mybatis,spring配置,jstl 标签

Java中的属性,通常可以理解为其属名性时根据get和set方法名得出的. 而字段,通常叫做"对象成员". 其规则是:去掉get或set后其剩余的字符串,如果第二个字母是小写的,则把第一个字母也变成小写 getAge---->age getCPU---->CPU 属性只局限于类中方法的声明,并不与类中其他成员相关,属于javabean的范畴.例如: void setA(String s){} String getA(){} 当一个类中拥有这样一对方法时,我们可以说,这个类中

Java中的属性和字段有什么区别

1.Java中的属性和字段有什么区别? 答: Java中的属性,通常可以理解为get和set方法. 字段,通常叫做“类成员”. 属性只局限于类中方法的声明,并不与类中其他成员相关.例如: void setA(String s){} String getA(){} 当一个类中拥有这样一对方法时,我们可以说,这个类中拥有一个可读写的 a 属性(注意是小写a).如果去掉了set的方法,则是可读属性,反之亦然. 类成员(字段),通常是在类中定义的类成员变量,例如: public class A{ pri

你知道属性(字段)与构造函数谁先执行吗?

你知道属性(字段)与构造函数谁先执行吗?    最近一直在马不停蹄的做开发,正所谓学而不思则罔,思而不学则殆,开发过程中其实学到了好多,也发现了好多,但是有时候会因为某些原因没能深入探讨和研究,而只是想当然的处理,今天突然闲心泛滥,想研究下一个类中属性与构造函数到底哪个先执行,执行顺序策略是怎样的?这个问题其实已经困扰我好久,因为有些整个类中需要使用的一下对象,我有时候喜欢直接在声明的时候就进行实例化,但是这样真的好吗?会不会影响到速度.性能之类的问题?我看过一些别人的代码,总之,有的将实例化对

C#创建对象时各种初始化属性、字段的方式的执行顺序

创建对象代码如下: new FilterInfo(Student.CreateTimeProperty,"朱七",Express.Equals,Relationship.Or) { Field = Student.CreateTimeProperty, Value = "朱6", Express = Express.Equals, Relationship = Relationship.Or } 而在FilterInfo的定义中属性public Relationsh

属性与字段的区别

本文转载自NetLYF 首先从两者的声明上来看,公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值. 由于属性的实质是方法(get或set方法),在IL中是没有属性的概念的.所以对于开发过程中常用的赋值和取值操作来说,使用公共变量肯定会比使用属性速度要快,性能上也稍高(方法和变量哪个速度不用说了吧). 公共字段虽然在速度上快,但它必须开放字段为public,这样一来对象的调用者便可以直接修改其值,值的内容是否合法,

C#中的属性和字段

属性和字段的区别 在C#中,我们可以自由的访问公有字段,但在一些场合中,我们可能希望限制字段的赋值范围.或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些字段值,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作. get和set 有两个类person: public class person { public string name; } public class person { public st

C# 属性和字段的区别

属性和字段的区别 在C#中,我们可以非常自由的.毫无限制的访问公有字段, 但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值.或是要求字段只能读或只能写, 或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性, 属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作. 在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值. 当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个