• [C#基础] 类


    类成员

    字段和方法是最重要的类成员类型,字段是数据成员,方法是函数成员

    字段

    字段是隶属于类的变量

    • 它可以是任何类型,无论是预定义类型还是用户定义类型
    • 和所有变量一样,字段用来保存数据
      • 它们可以被写入
      • 它们可以被读取

    方法

    方法是具有名称的可执行代码块

    声明方法最简单语法如下

    • 返回类型,如果一个方法不返回值,那么返回类型被指定为void
    • 名称
    • 参数列表
    • 方法体

    创建变量和类的实例

    • 类是引用类型
    • 数据的引用保存在类类型的变量中

    常量与静态量

    虽然常量成员变现的像一个静态量,但不能将常量声明为static

    属性

    属性是代表类的实例或类中的一个数据项成员

    与字段类似,属性有如下特征

    • 它是命名的类成员
    • 它有类型
    • 它可以被赋值和读取

    然而和字段不同,属性是一个函数成员

    • 它不为数据存储分配内存
    • 它执行代码

    属性声明和访问器

    set访问器总是

    • 拥有一个单独的,隐式的值参,名称为value,与属性类型相同
    • 拥有一个返回类型void

    get访问器总是

    • 没有参数
    • 拥有一个与属性类型相同的返回类型

    执行其他计算

    属性访问器不不局限于仅仅对关联的后备字段传进传出参数,访问器能进行任何计算,或不执行任何计算,唯一必须的行为是get访问器要返回一个属性类型的值

    下面的代码,set访问器在设置关联字段之前实现过滤,如果输入大于100,就设为100

     int _x = 10;
            int X
            {
                get { return _x;}
                set { _x = value > 100 ? 100 : value; }
            }
    View Code

    只读和只写属性

    • 只有get访问器的属性称为只读属性
    • 只有set访问器的属性称为只写属性
    • 两个访问器中至少要定义一个,否则编译器会产生一条错误消息

    计算只读属性示例

    下列代码展示了只读属性

     int _x = 3;
            int _y = 4;
            int Z//只读属性
            {
                get { return (_x+_y);}
            }
    View Code

    Z的值只能基于_x和_y的值产生

    自动实现的属性

    自动实现的属性要点如下

    • 不声明后备字段
    • 不能提供访问器的方法体
    • 除非通过访问器,否则不能访问后备字段

    静态属性

    属性也可以声明为static。静态属性的访问器和所有静态一员,具有以下特点

    • 不能访问类的实例成员,虽然他们能被实例成员访问
    • 不管类是否存在,他们都是存在的
    • 当从类的外部访问时,必须使用类名访问,而不是实例名

    readonly修饰符

    字段可以用readonly修饰,其作用类型于字段声明为const,一但值被设定就不能改变

    • const字段只能在字段的声明中进行初始化,而readonly字段可以在下列任意位置初始化
      • 字段声明语句,类型const
      • 类的任何构造函数,如果是static字段,初始化必须在静态构造函数中完成
    • const字段的值必须在编译时决定,而readonly的值可以在运行时决定
    • 和const不同,const的行为总是静态的,而readonly的以下两点是正确的
      • 它可以是实例字段,也可以是静态字段
      • 它在内存中有存储位置

    this关键字

    this关键字在类中使用,是对当前实例的引用。它只能被用在下列类成员的代码块中

    • 实例构造函数
    • 实例方法
    • 属性和索引器的实例访问器

    this用于下列目的

    • 用于区分类的成员和本地变量的参数
    • 作为调用方法的实参

    索引器

    什么是索引器

    索引器是一组get和set的访问器,与属性类似。

    下图展示了一个类的索引器的表现形式,该类可以获取和设置string型值

    索引器和属性

    索引器和属性很多方面是相似的。

    • 和属性一样,索引器不用分配内存来存储
    • 索引器和属性都主要被用来访问其他数据成员,它们与这些成员关联,并未它们提供获取和设置访问
      • 属性通常表示单独的数据成员
      • 索引器通常表示多个数据成员

    关于索引器,还有一些注意事项

    • 和属性一样,索引器可以只有一个访问器,也可以两个都有
    • 索引器总是实例成员,因此不能声明为static
    • 和属性一样,实现get和set的访问器的代码不必一定要关联的某个字段或属性。这段代码可以做任何事情或什么都不做,只要get访问器返回某个指定类型的值即可

    声明索引器

    声明索引器的语法如下

    • 索引器没有名称。在名称的位置是this关键字
    • 参数列表在方括号中间
    • 参数列表中必须至少声明一个参数

    声明索引器类似于声明属性

    索引器的set访问器

    set访问器有如下语法

    • 它的返回类型为void
    • 它使用的参数列表和索引器声明中的相同
    • 它有一个名称为value的隐式参数,值参类型和索引类型相同

    索引器的get访问器

    get访问器有如下语义

    • 它的参数列表和索引器声明中的相同
    • 它返回与索引器相同类型的值

    下列代码为类X声明一个索引器

     class X
        {
            public string A; //调用字段1
            public string B; //调用字段2
            public string C; //调用字段3
            public string this[int index]
            {
                set 
                { 
                    switch(index)
                    {
                        case 0:
                        A = value;
                        break;
                        case 1:
                        B = value;
                        break;
                        case 2:
                        C = value;
                        break;
                        default:
                        throw new ArgumentOutOfRangeException("index");
    
                    }
                }
                get
                {
                    switch (index)
                    {
                        case 0: return A;
                        case 1: return B;
                        case 2: return C;
                        default:
                            throw new ArgumentOutOfRangeException("index");
                    }
                }
            }
        }
    View Code

    访问器的访问修饰符

    默认情况下,成员的两个访问器有和成员自身相同的访问级别。也就是说,如果一个属性有public访问级别,那么它的两个访问器都有同样的访问级别,对索引器也一样。

      不过,你可以为两个访问器分配不同的访问级别。如下代码演示了一个非常常见的列子,那就是为set访问器声明为private,为get访问器声明为public。get之所以是public的,是因为属性的访问级别就是public的。

      在这段代码中,尽管可以从类的外部读取该属性,但却只能在类的内部设置它。

      class Person
        {
            public string Name { get; private set; }
            public Person(string name)
            {
                this.Name = name;
            }
        }
    View Code

    访问器的访问修饰符有几个限制。最重要的限制如下

    • 仅当成员(属性或索引器)既有get访问器和set访问器时,其访问器才能有访问修饰符
    • 虽然两个访问器都必须出现,但它们中只能有一个有访问修饰符
    • 访问器的访问修饰符必须比成员的访问级别有更严格的限制性

    下图阐明了访问级别的层次。访问器的访问级别在图表中的位置必须比成员的访问级别的位置低

  • 相关阅读:
    wm_syscommand
    VC中的#pragma指令的用法
    C语言|博客作业03
    C语言|博客作业09
    C语言|博客作业07
    C语言|博客作业05
    C语言|博客作业02
    C语言|博客作业08
    C语言|博客作业06
    C语言|博客作业04
  • 原文地址:https://www.cnblogs.com/Nomads/p/4821866.html
Copyright © 2020-2023  润新知