关闭

C#属性详解(c# 通过公共属性访问私有成员 优点)

1188人阅读 评论(0) 收藏 举报
分类:

C#属性是域的扩展(即通常说的成员变量或字段等)它配合C#中的域(字段)使用,使之构造一个安全的应用程序,为什么说通过属性来替代域会提高应用程序的安全呢?

    原因就在于C#属性通过访问器(Accessors)用进行数据访问.所以C#的属性可以设置为只读或只写. 而字段却没有这样的功能(只可设置只读).我们都知道在程序中有时我们是不允许用户修改一些属性的,比如地球是圆的。原则上我们是不能修改此属性.那么我们就可以通过一个属性来实现这样的功能.让它设置为只读属性.

    属性的特点:C#属性是对类中的字段(fields)的保护,像访问字段一样来访问属性。同时也就封装了类的内部数据。每当赋值运算的时候自动调用set访问器,其他时候则调用get访问器。 以 帕斯卡命名 不能冠以Get/Set。静态属性是通过类名调用的!

    前面我们说到属性是字段的扩展,我们都知道如果要在类外部访问字段,就要公开(Public)这个成员字段。但是如果我们真的这样做了,那这个成员字段的就可以被任意访问(包括修改,读取).那怎么办呢? 用一个属性就可以解决这个问题.

C#属性是通过Get(读取)、Set(设置)来访问属性的. 
public class Test 

    public Test() 
       { 
              // 
// TODO: 在此处添加构造函数逻辑 
// 
        } 
    //为了说明问题这里我们用中文 
    public string 地球的形状; 

在上面的例子里"地球的形状"这个字段就可以任意的访问,不受任何的束缚.但是我们都知道地球是圆的,是不允许修改的一个特性,那怎么办呢?用一个属性就可以轻松的解决这个问题. 
public class Test 

    public Test() 
       {         
              // 
// TODO: 在此处添加构造函数逻辑 
// 
       } 
    //为了说明问题这里我们用中文 
    private string 地球的形状="圆";//私有的成员变量,它对于外部是不可见的. 
    public string 地球形状 
        { 
           get 
           { 
              return 地球的形状;//这里将私有成员变量地球的形状返回给"地球的形状" 
           } 
        } 

这里我们只可以读取属性"地球形状",而不可以写,如果强制写编译器就会提示出错.这样我们就可以通过类来访问属性. 
Test MyTt=new Test();//实例化类 
string MyTemp=MyTt.地球形状;//读取类的属性 
下面我们说一下写的应用. 
public class Test 

    public Test() 
       { 
              // 
// TODO: 在此处添加构造函数逻辑 
// 
        } 
    //为了说明问题这里我们用中文 
    private string 你的名字;//私有的成员变量,它对于外部是不可见的. 
    public string 名字 
        { 
           get 
           { 
              return 你的名字;//这里将私有成员变量"你的名字"的形状返回给"名字" 
           } 
           set 
           { 
               你的名字=value;//这里的value将等于"名字" 这个属性值
           } 
        } 

这样我们就可以对属性读取和写了. 
Test MyTt=new Test();//实例化类 
MyTt.名字="Simon"//设置属性 
String MyTemp=MyTt.名字;读取属性值 
通过上面的例子我们可以看出属性只不过是做了一个中介的角色而已,真正工作的还是字段(域),但这样做可以更面向对象,写出更安全的应用程序。

     C#提供了一个处理此概念的更清爽的方式。在C#中,get和set方法是内在的,而在Java和C++里则需人为维护。C#的处理方式有诸多优点。它鼓励程序员按照属性的方式去思考—把这个属性标为可读写的和只读的哪个更自然?或者根本不应该为属性?如果你想改变你的属性的名称,你只要检查一处就可以了。

    C#中属性这种机制使得在保证封装性的基础上实现了访问私有成员的便捷性。一个支持属性的语言将有助于获得更好的抽象。

    来自MSDN中的内容:

属性和属性过程

    可以使用属性和字段在对象中存储信息。属性使用属性过程控制如何设置或返回值,而字段只是公共变量。属性过程是在属性定义中声明的代码块,可用于在设置或检索属性值时执行代码。

    具有两种类型的属性过程:用于检索属性值的 Get 属性过程和用于为属性分配值的 Set 属性过程。例如,存储银行帐户余额的属性可能会在 Get 属性过程中使用代码以在返回可用余额之前记入利息并检查服务费。然后,您可以使用 Set 属性过程验证余额并防止它以不正确的方式更新。简而言之,属性过程允许对象保护和验证自己的数据。

只读和只写属性
    大多数属性都具有 Get 和 Set 属性过程,这两个属性过程可用于读取和修改存储在内部的值。然而,您可以使用 ReadOnly 或 WriteOnly 修饰符来限制对属性进行修改或读取。

    只读属性不能具有 Set 属性过程。这种属性用于需要公开但不允许修改的项。例如,可以使用只读属性来提供计算机处理器的速度。

    只写属性不能具有 Get 属性过程,它们用于使用不应或不能存储在对象中的数据配置对象。例如,只写属性可用于获取密码并在不存储该密码的情况下更改对象的状态。



转自:deepwishly

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9826次
    • 积分:261
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:15篇
    • 译文:0篇
    • 评论:0条