在C#中我们可以很自由的访问共有字段,但有时我们可能需要某字段只能读或者写,或在改变字段值得时候做一些其他事情,显然这些仅仅依靠字段是无法实现的,于是便有了属性。

  1、基本用法

  c#中的属性由属性作用域中定义的get作用域(访问方法)和set作用域(访问方法)构成。

class Test
{
private int number; //int表示该属性所封装的数据类型
//数据类型必须与相应的字段(number)相同
public int Num
{
get{return number;}
set{number=value;}
}
}

  当封装数据时,可能希望配置一个只读属性。为此,可以忽略set块。类似,如果想拥有一个只读属性,就忽略get块。

  2、静态属性  

  C#静态属性可以是读写属性,只读属性,只写属性中的任意一种。静态访问器适用于整个类,而不是类的实例。静态属性中的set,get访问器只能访问类的静态成员。静态属性可以通过类名访问,不能使用实例调用,这与静态方法相同。

 //简单的储蓄账户类
class SavingAccount
{
//实例级别的数据
public double currBalance; //静态数据点
private static double currInterestRate = 0.04; //静态属性
public static double InterestRate
{
get{return currInterestRate;}
set{currInterestRate=value;}
}
}

  3、自动属性

  自动属性可以简化封装数据字段的过程,减轻了定义私有返回字段和相关c#属性成员的工作。在定义自动属性时,只指定访问修饰符、实际的数据类型、属性名称和空的get/set作用域。在编译时,编译器为类型自动生成了私有返回字段和适当的get/set实现逻辑。

 class Enemy
{
//自动属性
public string Name{get;set;}
public int Life{get;set;}
public float Attack{get;set;} }

  注意:与传统的属性不同的是,不允许构建只读或只写的自动属性,自动属性定义是必须同时支持读写功能。但是定义更严格的get或set是可以的

  4、关于自动属性和默认值

  可以直接在代码中使用封装了数字或布尔数据的自动属性,因为隐藏的返回字段将设置一个可以直接使用的安全的默认值。但如果自动属性封装了另一个类变量,隐藏的私有引用类型的默认值将设为null。

  例如下面的类spawn,使用了两个自动属性

 class Spawn
{
//隐藏的int字段默认值为0
public int numbers{get;set;}
//隐藏的Enemy返回字段为null
public Enemy MyEnemy{get;set;}
}

  当直接调用MyEnemy时,将会在运行时得到空引用异常,因为没有为后台使用的Enemy成员变量设置新的对象。

  由于私有的返回字段是在编译时创建的,所以不能直接使用new关键字直接分配引用类型,必须在类的构造函数内部执行,以确保对象以安全方式诞生。 

 class Spawn
{
//隐藏的int字段默认值为0
public int numbers{get;set;}
//隐藏的Enemy返回字段为null
public Enemy MyEnemy{get;set;} //必须用构造函数重写分配给隐藏返回字段的默认值
public Spawn()
{
MyEnemy = new Enemy();
numbers = ;
} public Spawn(Enemy enemy, int num)
{
MyEnemy = enemy;
numbers = num;
}
}

c#中的属性的更多相关文章

  1. Objective-C中的属性机制

    Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现.在学习OC中属性之前我们先要知道为什么要为变量实现gett ...

  2. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  3. 转载:java 中对类中的属性使用set/get方法的意义和用法

    经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...

  4. DTD中的属性类型

    <![CDATA[文本内容]]> DTD中的属性类型 全名:character data 在标记CDATA下,所有的标记.实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待, ...

  5. java-读取类中的属性名称和值

    方法 /** * 获取类中的所有属性明名称和值(因涉及到可能会是继承关系的父类,所以从f中去属性名称,从f2中取值,两个可以一样,也可以使父类) * @param f:读取属性类(如果取父类的,则这里 ...

  6. 深入理解css中position属性及z-index属性

    深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共 ...

  7. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  8. 使用angularjs定义html中的属性ng-attr-(suffix)

    html中的属性很多,同样可以使用angularjs来定义: ng-attr-(suffix)=只能使用变量定义 <div title="angularjs中的title"& ...

  9. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  10. XCODE UITextField 中的属性和用法

    XCODE  UITextField  中的属性和用法 一些基本的用法 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedR ...

随机推荐

  1. 使用notepad运行python

    Notepad++ 是一个开源的文本编辑器,功能强大而且使用方便,一般情况下,Notepad++作为代码查看器,很方便,但是每次要运行的时候,总是需要用右键打开其他的IDE来编译和运行,总有些不方便. ...

  2. poj1679(最小生成树)

    传送门:The Unique MST 题意:判断最小生成树是否唯一. 分析:先求出原图的最小生成树,然后枚举删掉最小生成树的边,重做kruskal,看新的值和原值是否一样,一样的话最小生成树不唯一. ...

  3. tudou link

    http://www.tudou.com/programs/view/QdOktCIUfQ0/?tid=-1&aid=-120137222&pid=41050010&oid=2 ...

  4. Java提供的enum详解

    今天第一天看<<Effective Java>>,看了第六章的第一条就是全书的第30条--用enum代替int常量. 1.第一次知道原来enum也可以像class那样拥有成员函 ...

  5. Linux内核——进程管理与调度

    进程的管理与调度 进程管理 进程描写叙述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包括一个详细进程的全部信息,类型为task_struct,称为进程描写叙 ...

  6. cocos2d-x ndk adt mac 路径配置

    export PATH=/bin:/sbin:/usr/local/mysql/bin export PATH=$PATH:/Applications/MacVim-snapshot-68 expor ...

  7. swift 新功能介绍

    原文链接:http://www.cocoachina.com/applenews/devnews/2014/0617/8857.html 假设你和我一样,准备好好看看苹果的 Keynote,兴奋地准备 ...

  8. Mac OS X在建筑Python科学计算环境

    经验(比如这篇日志:http://blog.csdn.net/waleking/article/details/7578517).他们推荐使用Mac Ports这种软件来管理和安装全部的安装包.依照这 ...

  9. AS3.0下去除flash右键菜单

    这两天工作中遇到一个问题,就是网页中内嵌的flash小游戏的用户体验,当鼠标在flash上点击右键时,出现的右键菜单中会有播放,停止等选项,虽然不会造成什么漏洞,但是体验非常差.在寻找解决方案的时候, ...

  10. dede时间格试,dede时间标签

    dede的日期时间格式[field:pubdate function='strftime("时间",@me'/]这个是固定格式,(利用strftime()函数格式化时间),因些只需 ...