C#教程第十课:属性

教程

本节课将介绍C#的属性,其目的包括:
1.理解什么是属性

2.如何实现属性

3.创建一个只读属性

4.创建一个只写属性

属性是C#中独具特色的新功能。通过属性来读写类中的域,这具有一定的保护功能。在其它语言中,这是通过实现特定的getter和setter方法来实现的。C#的属性具有保护功能,可以让你就象访问域一样访问属性。要了解属性的用法,我们先来看看如何用传统的方法对域进行封装。

1.清单 10-1. 传统的访问类的域的例子:Accessors.cs

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int getSomeProperty()
{
return someProperty;
}
public void setSomeProperty(int propValue)
{
someProperty = propValue;
}
}

public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.setSomeProperty(5);
Console.WriteLine("Property Value: {0}", propHold.getSomeProperty());
return 0;
}
}

说明

1.清单 10-1 演示了用传统方法访问类的域的例子。

PropertyHolder类有个我们感兴趣的域someProperty, PropertyHolder类带有两个方法:getSomeProperty和setSomeProperty。getSomeProperty方法返回someProperty域的值。SetSomeProperty方法设置域someProperty的值。

2.类PropertyTester使用类PropertyHolder中的方法来获取someProperty域的值。

Main方法中新创建了一个PropertyHolder对象,之后通过使用setSomeProperty方法,调用propHold对象的setSomeProperty方法,设置其值为5。之后,调用Console.WriteLine方法输出属性值。对propHold对象的getSomeProperty的调用,是用来获取属性值的。它输出"Property Value: 5"到控制台。

3.这种传统的访问域的信息的方法是很好的,因为它支持面向对象的封装的概念。

如果在对域someProperty的实现中,域的类型从int 类型变为byte类型,上述的方法仍然适用。现在,如果采用属性的话,其实现会做得更为平滑。

2.清单 10-2. 使用属性访问类的域:Properties.cs

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int SomeProperty
{
get
{
return someProperty;
}
set
{
someProperty = value;
}
}
}

public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.SomeProperty = 5;
Console.WriteLine("Property Value: {0}", propHold.SomeProperty);
return 0;
}
}

说明

1.清单 10-2 演示了如何创建和使用属性。

PropertyHolder类中有个"SomeProperty" 属性的实现。注意:属性名的首字母必须大写,这是属性名"SomeProperty"和域名"someProperty"的唯一区别。属性有两种访问操作:get和set。Get访问操作返回的是someProperty域的值。Set访问操作是设置someProperty域的值,其值为"value"的内容。Set访问符号后面的"value"是C#中的保留字。通常,在其他场合下使用"value"关键字会出错。。

2.PropertyTester 类使用PropertyHolder类中的SomeProperty属性。

在Main方法的第一行中, 创建了PropertyHolder对象propHold。之后,把propHold对象的 someProperty 域的值设置为5,很简单,就象对域赋值一样,给属性赋值。

3.Console.WriteLine方法输出 propHold对象的someProperty域的值。

这是通过使用propHold对象的SomeProperty属性来完成的。很简单,就象对域赋值一样,赋值给属性。属性可以设置为只读的,这可以通过在属性的实现中只设一个get访问符号来实现。

3.清单 10-3. 只读属性: ReadOnlyProperty.cs

using System;
public class PropertyHolder
{
private int someProperty = 0;
public PropertyHolder(int propVal)
{
someProperty = propVal;
}
public int SomeProperty
{
get
{
return someProperty;
}
}
}

public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(5);
Console.WriteLine("Property Value: {0}", propHold.SomeProperty);
return 0;
}
}

说明

1.清单10-3 演示了如何实现只读属性。

PropertyHolder类中,SomeProperty 属性只有一个get访问操作,没有用到set访问操作。PropertyHolder类中还有个接受整型参数的构造函数。

2.在PropertyTester类的Main方法中,创建了新名为propHold的PropertyHolder类的对象。

propHold对象在实例化时,调用了带参数的PropertyHolder构造函数。在本例中,参数值为5,这对propHold 对象的someProperty域的值进行了初始化。

3.因为PropertyHolder 类的SomeProperty属性是只读的,所以没有其他的方法来设置someProperty域的值。

如果你插入了"propHold.SomeProperty = 7"语句到程序清单中,该程序编译将不会通过,因为SomeProperty是只读属性。在Console.WriteLine 方法中使用SomeProperty属性时,程序执行正常。这是因为该方法调用了SomeProperty属性的get访问操作,这是个只读操作。

4.清单 10-4. 只写属性: WriteOnlyProperty.cs

using System;
public class PropertyHolder
{
private int someProperty = 0;
public int SomeProperty
{
set
{
someProperty = value;
Console.WriteLine("someProperty is equal to {0}", someProperty);
}
}
}

public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder();
propHold.SomeProperty = 5;
return 0;
}
}

说明

1.清单 10-4 演示了如何创建和使用只写属性。

这一次,在PropertyHolder类中的SomeProperty属性中,去掉了get访问操作,而加上了set访问操作。其功能是输出someProperty域的值。

2.在PropertyTester 类中的Main方法中,用缺省的构造函数对PropertyTester类进行初始化。

之后,使用propHold 对象的SomeProperty属性,设置该域的值为5。这就调用了propHold 对象的set访问操作, 把someProperty 域的值设置为5,最后,把"someProperty is equal to 5"的信息输出到控制台。

小结
现在,你已经了解了什么是属性,以及属性的使用方法,你也了解了使用属性和使用传统的类的方法之间的区别。属性可以是只读的,也可以是只写的,每种场合下的使用方法,你都有所了解。

时间: 2016-04-05

C#教程第十课:属性的相关文章

数据结构教程 第十课 栈的表示与实现

本课主题: 栈的表示与实现 教学目的: 栈的数据类型定义.栈的顺序存储表示与实现 教学重点: 栈的顺序存储表示与实现方法 教学难点: 栈的定义 授课内容: 一.栈的定义 栈是限定仅在表尾进行插入或删除操作的线性表. 栈的表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈. 栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai(- ElemSet,i=1,2,...,n,n>=0} 数据关系:R1={<ai-1,ai>|ai-1,ai(- D,i=2,...,n} 基本

数据结构教程 第二十课 广义表

教学目的: 广义表的定义及存储结构 教学重点: 广义表的操作及意义 教学难点: 广义表存储结构 授课内容: 一.广义表的定义 广义表是线性表的推广,其表中的元素可以是另一个广义表,或其自身. 广义表的定义: ADT GList{ 数据对象:D={i=1,2,...,n>=0;ei(-AtomSet或ei(-GList, AtomSet为某个数据对象} 数据关系:R1={<ei-1,ei>|ei-1,ei(-D,2=<i<=n} 基本操作: InitGlist(&L);

VBScript教程 第十课 VBScript编码约定_vbs

什么是编码约定? 编码约定是帮助您使用 Microsoft Visual Basic Scripting Edition 编写代码的一些建议.编码约定包含以下内容: ·对象.变量和过程的命名约定 ·注释约定 ·文本格式和缩进指南 使用一致的编码约定的主要原因是使 Script 或 Script 集的结构和编码样式标准化,这样代码易于阅读和理解.使用好的编码约定可以使源代码明白.易读.准确,更加直观且与其他语言约定保持一致. 常数命名约定 VBScript 的早期版本不允许创建用户自定义常数.如果

javascript asp教程第十课--global asa_ASP基础

Global.asa: First of all, what is a global.asa? It's an optional script file that holds certain "global" information that you can access through the entire ASP appliciation. The global.asa is a plain text file saved with the .asa extension. You

javascript asp教程第十课--global asa

Global.asa: First of all, what is a global.asa? It's an optional script file that holds certain "global" information that you can access through the entire ASP appliciation. The global.asa is a plain text file saved with the .asa extension. You

网赚指南经典教程(共十课)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 [编注]本文是一个早期的网赚教程,拿来给大家分享的目的,是他的思路,而不是他的具体赚钱方法 第一课 必需的准备工作! 一. AI RoboForm!"工欲善其事,必先利其器!"要想玩网络赚钱,自动填表工具是必不可少的东西.因为你每参加一个赚钱网站,都需要注册.填表,而如果每一次都手工去填的话,简直是不可想象的事情!因此,站长向你推荐AI RoboForm,请点击下载.软件很小,功能却很强大.下载.安装.运行后屏幕右下角的状态栏里多了一个层

Photoshop初学者十课

  第一课:一个PS高手的话 1.不要看到别人的作品第一句话就说:给个教程吧!你应该想这个是怎么做出来的.当你自己想出来,再对照别人的教程的时候,你就知道自己和别人的思路的差异 2.初学者请不要看太多太多的书那会误人子弟的 ,先找本系统的学,很多人用了很久PS,都是只对部分功能熟悉而已,不系统还是不够的 3.看help,不要因为他们很难而我们自己是初学者所以就不看;帮助永远是 最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观 4.不要被蒙版,通道等词汇所迷惑; 通道就是选区,呵呵 5

C#教程第五课:方法

教程 本节课向你介绍C#的方法,其目的是:1.了解方法的结构格式 2.了解静态和实例方法之间的区别 3.学会实例对象的使用 4.学会如何调用实例化的对象 5.学会方法的四种参数类型的使用 6.学会使用"this"引用 以往,对于每个程序来说,所有的工作都在Main()方法中实现.这对于功能简单的程序是合适的,因为仅仅用来学习一些概念.有个更好的方法来组织你的程序,那就是使用方法.方法是很有用的,因为方法可以让你在不同的单元中分开设计你的逻辑模块. 方法的结构格式如下: 属性 修饰符 返

Java语言入门教程(十二):Java语言中继承之基本概念

从教程(十)开始,已经从学习单个类的基本语法,转到了学习多个类之间 的关系.教程(十)中,学习了类与类长间的两种关系,关联和依赖.为了维护 1对多的关系,在教程(十一)中,学习了数组.除了关联和依赖,类与类还有 一种非常重要且常见的关系,就是继承.本文将介绍继承的概念.作用.使用场 景等. 假设有这样一个简单需求(其实谈不上是需求,仅仅为了初学者容易理解而 编造):某培训中心要开发一个内部员工管理系统.该培训中心目前有两个部门 ,技术资源部和业务部.技术资源部的员工负责讲课,称为讲师.业务部员工