4.5 属性
知识点讲解:光盘:视频\PPT讲解(知识点)\第4章\属性.mp4
属性是对现实世界中实体特征的抽象,提供了对类或对象性质的访问。类的属性所描述的是状态信息,在类的某个实例中,属性的值表示该对象的状态值。属性和字段是密切相关的,属性是字段的扩展,两者都是具有关联类型的命名成员,而且对两者进行访问的语法格式也是相同的。
但是,属性不表示存储位置,这和字段不同。属性使用访问器,通过访问器指定在它们的值被读取或写入时需执行的语句。因此,属性提供了一种机制,它把读取和写入对象的某些性质与一些操作关联起来。它们甚至还可以对此类性质进行计算。
声明属性的语法格式如下。
修饰符 类型 属性名
{
get
{
……
}
set
{
……
}
}
其中,修饰符是可选的,最为常用的就是访问修饰符,也可以使用static修饰符。
当属性声明包含static修饰符时,则被称为静态属性。当不存在static修饰符时,则被称为实例属性。具体说明如下。
- 静态属性不与特定实例相关联,因此在静态属性的访问器内引用this会导致编译时错误。
- 实例属性与类的一个给定实例相关联,并且可以在属性的访问器内通过this来访问该实例。
属性的类型可以是任何的预定义或者自定义类型。属性名是一种标识符,命名规则与字段相同。
C#中的属性通过get和set访问器来对属性的值进行读写。get和set访问器分别用关键字get和set,以及位于一对大括号内的代码块构成。代码块代码分别指定调用相应访问器时需执行的语句块。
get和set访问器是可选的,在使用时必须注意如下4点:
(1)get访问器相当于一个具有属性类型返回值的无参数方法。除了作为赋值的目标,当在表达式中引用属性时,将调用该属性的get访问器以计算该属性的值。get访问器必须用return语句来返回,并且所有的return语句都必须返回一个可隐式转换为属性类型的表达式。
(2)set访问器相当于一个具有单个属性类型值参数和void返回类型的方法。set访问器的隐式参数始终命名为value。当一个属性作为赋值的目标,或者作为运算操作数值被引用时,就会调用set访问器,所传递的参数将提供新值。
(3)不允许set访问器中的return语句指定表达式。由于set访问器隐式具有名为value的参数,因此,在set访问器中不能自定义使用名称为value的局部变量或常量。
(4)由于属性的set访问器中可以包含大量的语句,因此可以对赋予的值进行检查。如果值不安全或者不符合要求,就可以进行提示。这样就可以避免因为给类的数据成员设置了错误的值而导致的错误。
根据get和set访问器是否存在,属性可分成如下3种类型。
- 读写属性:可以同时包含 get 访问器和 set 访问器的属性。
- 只读属性:只具有 get 访问器的属性。将只读属性作为赋值目标会导致编译时错误。
- 只写(write-only)属性:只具有 set 访问器的属性。除了作为赋值的目标外,在表达式中引用只写属性会出现编译时错误。
实例009 使用C#属性输出类成员的操作结果
源码路径 光盘\daima\1\4\3 视频路径 光盘\视频\实例\第4章\009
本实例的实现文件为shuxing.cs,具体的实现过程如下。
(1)定义类mm。
(2)分别定义两个读写属性Width和Height,并设置返回参数。
(3)定义一个只读属性Mianji,赋值为参数kuan和gao的积。
(4)分别定义两个构造函数。
(5)分别创建对象实例rect和rect1,并对参数进行赋值。
(6)根据赋予的参数值,将各参数值输出。
实例文件shuxing.cs的实现代码如下。
namespace shuxing
{
public class mm
{
protected int kuan;
protected int gao;
public int Width
{
get
{
return kuan;
}
set
{
if (value > 0)
kuan = value;
else
Console.WriteLine("宽的值不能为负数。");
}
}
public int Height
{
get
{
return gao;
}
set
{
if (value > 0)
gao = value;
else
Console.WriteLine("高的值不能为负数。");
}
}
public int Mianji
{
get
{
return kuan * gao;
}
}
public mm()
{
}
public mm(int cx, int cy)
{
Width = cx;
Height = cy;
}
public static void Main()
{
mm rect = new mm();
rect.Width = 2;
rect.Height = 4;
Console.WriteLine("宽 = {0}, 高 = {1}, 面积 = {2}", rect.Width, rect.Height, rect.Mianji);
rect.Width = -2;
rect.Height = -4;
Console.WriteLine("宽 = {0}, 高 = {1}, 面积 = {2}", rect.Width, rect.Height, rect.Mianji);
mm rect1 = new mm(-4, -6);
Console.WriteLine("宽 = {0}, 高 = {1}, 面积 = {2}", rect1.Width, rect1.Height, rect1.Mianji);
Console.ReadKey();
}
}
}
范例017:字符串连接
源码路径:光盘\演练范例\017视频路径:光盘\演练范例\017范例018:分割字符串
源码路径:光盘\演练范例\018视频路径:光盘\演练范例\018\
上述代码执行后,将输出各参数的值,如图4-5所示。
图4-5 实例执行结果
共有条评论 网友评论