当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

4.5属性

8/31/2020 9:56:04 PM 人评论

4.5属性

图片 1 知识点讲解:光盘:视频\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所示。

M4$G38__BN5YO6VK0FIDULW

图4-5 实例执行结果

上一篇:4.4对象

下一篇:4.6命名空间

相关教程

共有条评论 网友评论

验证码: 看不清楚?