关闭

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

1816人阅读 评论(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
查看评论

C# 访问类的私有成员的三种方法与区别

在程序中,难免要访问某个对象的私有成员。那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可;而另一个就是提供公有的成员访问函数来进行访问。那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成。 首先来看看...
  • u010706189
  • u010706189
  • 2015-12-17 09:22
  • 3746

在C#中怎么通过类名访问类的属性

如果我有一个拥有FirstName的属性的类Perso,我能通过如下方式访问:Person.FirstName = "Mike";能通过下面的方式来访问吗Person["FirstName"]="Mike";通过反射类来实现,但是这种方法性...
  • jetxia
  • jetxia
  • 2007-02-09 10:41
  • 2778

C#属性、字段和成员变量的关系区别

我们先来写一个类Person,字段为:name、age、sex,属性:Name、Age、Sex。那么,成员变量:name、age、sex、Name、Age、Sex。字段和属性,都可以叫做是成员变量。属性和字段都是用来存储数据的,但肯定是有不同的(要不然也不会起两个名字,干脆叫一个名算了~)。 ...
  • zsk1196468672
  • zsk1196468672
  • 2016-07-30 18:53
  • 4694

【.Net码农】C#反射获取 所有字段 及 私有字段

http://blog.csdn.net/liyifei21/article/details/34838375 using System; using System.Collections.Generic; using System.Text; using System.Re...
  • CrackLibby
  • CrackLibby
  • 2015-08-05 09:36
  • 2456

C#如何取出非公共成员

简述: 一般而言,非公共成员是受保护的,不能被外部访问的,这些都是基于安全性考虑。可是有时,我们很想取到非公共成员的某个对象。那我们就得用到两个方法: GetType().GetField(); GetType().GetProperty(); GetField()用来获取字段,GetPro...
  • yueguangzhiyuan
  • yueguangzhiyuan
  • 2013-05-14 16:26
  • 2494

C# 类,私有公有属性,继承

class BaseFile { //字段、属性、构造函数、函数、索引器 //私有字段 private string _filePath; public string FilePath //快捷键 ctrl+R+E { get { return _filePath; } set...
  • houyanhua1
  • houyanhua1
  • 2017-12-07 18:54
  • 85

封装:C#描叙 --- 使用属性的好处

 绪论 对于一个具有丰富结构化程序设计经验的程序员来说,面向对象的程序设计可能会给他们带来非常不自然的感觉。封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。在本文中,我们将详细学习属性的特性。&#...
  • lyamlf_net
  • lyamlf_net
  • 2007-03-01 15:28
  • 3893

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

C#属性是域的扩展(即通常说的成员变量或字段等)它配合C#中的域(字段)使用,使之构造一个安全的应用程序,为什么说通过属性来替代域会提高应用程序的安全呢?     原因就在于C#属性通过访问器(Accessors)用进行数据访问.所以C#的属性可以设置为只读或只写. 而...
  • deepwishly
  • deepwishly
  • 2010-02-10 14:52
  • 5039

C# 方法和属性的访问权限修饰符解析

在C#中,方法和属性共有default、public、private、protected、internal、protected internal六种访问权限修饰符。 1.  default-默认访问权限   方法和属性前面没有权限修饰符时,表示为默认访问权限,在C#中,默认即...
  • smooth_tailor
  • smooth_tailor
  • 2016-08-10 09:25
  • 955

C# 利用反射访问修改私有成员

背景:项目中引用了一个dll,dll中有个自定义控件,自定义控件中有一个打印控件(Private),我的项目要根据权限设置打印控件的一些按钮是否显示            即:修改外部dll的私有控...
  • jeabo
  • jeabo
  • 2014-12-29 19:38
  • 852
    个人资料
    • 访问:14269次
    • 积分:310
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:15篇
    • 译文:0篇
    • 评论:0条
    文章分类