![PEVR虚拟现实编辑平台设计与实现精析](https://wfqqreader-1252317822.image.myqcloud.com/cover/793/51245793/b_51245793.jpg)
2.2.2 类的成员
类的成员可以分为类本身所声明的成员以及从基类中继承而来的类的成员,有以下类型:
1)成员常量:代表与类相关联的常量值。
2)域:即类中的变量。
3)成员方法:复杂执行类中的计算和其他操作。
4)属性:用于定义类中的值并对它们进行读写。
5)事件:用于说明发生了什么事情。
6)索引指示器:允许像使用数组那样为类添加路径列表。
7)操作符:定义类中特有的操作。
8)构造函数和析构函数:分别用于对类的实例进行初始化和销毁,包含可执行代码的成员被认为是类中的函数成员,这些函数成员有方法属性、索引指示器、构造函数和析构函数。
2.2.2.1 对类的成员的访问
在编写程序时,可以对类的成员使用不同的访问修饰符,从而定义它们的访问级别。
1.公有成员
C#中的公有成员提供了类的外部界面,允许类的使用者从外部进行访问。公有成员的修饰符为public,这是限制最少的一种访问方式。
2.私有成员
C#中的私有成员仅限于类中的成员可以访问。从类的外部访问私有成员是不合法的,如果在声明中没有出现成员的访问修饰符,按照默认方式成员为私有的。私有成员的修饰符为private。
3.保护成员
为了方便派生类的访问,又希望成员对于外界是隐藏的,这时可以使用protected修饰符声明成员为保护成员。
4.内部成员
使用internal修饰符的类的成员是一种特殊的成员,这种成员对于同一包中的应用程序或库是透明的,而在包.Net之外是禁止访问的。
使用下面的例子说明一下类的成员的访问修饰符的用法:
程序清单 2-6:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/26_01.jpg?sign=1738881417-MQeYV9oBsu7amJKVz2pB7bVd7ErByxjV-0-365bb14ef87fceb824cebb3843d2666f)
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/27_01.jpg?sign=1738881417-2kSWBEDrYiXDSRjeP6BrFTKh7LamHH8F-0-b55a3b6026d5c2851843ec1d1409af1e)
2.2.2.2 this保留字
保留字this仅限于在构造函数类的方法和类的实例中使用,它有以下含义:
1)在类的构造函数中出现的this:作为一个值类型,它表示对正在构造的对象本身的引用。
2)在类的方法中出现的this:作为一个值类型,它表示对调用该方法的对象的引用。
3)在结构的构造函数中出现的this:作为一个变量类型,它表示对正在构造的结构的引用。
4)在结构的方法中出现的this:作为一个变量类型,它表示对调用该方法的结构的引用,除此以外,在其他地方使用this保留字都是不合法的。
下面的代码演示了如何使用this保留字:
程序清单 2-7:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/27_02.jpg?sign=1738881417-Eyw4ioI2OAGAzz3xdoOIPOSxgdtHyxoW-0-6b434f9c58b444af94a9f93b6cf67c54)
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/28_01.jpg?sign=1738881417-wucf4AzfiRVonfUnTZmUwXeZdBbLYcNn-0-5c2069d8f9c6f070e8b43a3971942785)
程序运行的结果应该是
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/28_02.jpg?sign=1738881417-D3fDMOQMlCbMX1EKB9l3fDPpW3BCCyAx-0-ae9e63f7e08b3205cb6317b07fd804a9)
下面再举一个例子来说明this的用法:
程序清单 2-8:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/28_03.jpg?sign=1738881417-ISWJcsDBaxG8EOciC9FixX1avhHfVdWy-0-a8eb9816584669d53ead56033942d5cb)
程序用于求某个整数是否为另一个整数的阶乘,如果是,类Fact的方法GetFact返回该整数,否则GetFact返回-1。实际上在C#内部,this被定义为一个常量,因此使用this++、this--这样的语句都是不合法的,但是this可以作为返回值来使用。我们知道在Windows操作系统中,当前窗口总是被加亮显示,我们称该窗口被激活。例如在Word中,我们可以同时打开多个文档,每个文档窗口作为Word主窗口的一个子窗口,其中只有一个子窗口是当前激活的窗口。如果Word没有打开任何文档,则主窗口作为当前激活的窗口。
下面的例子中,我们声明了一个窗口类Window。假设类Window一次最多可以同时打开五个子窗口,Window的方法GetActiveWindow用于返回当前激活的窗口。如果打开了子窗口,则返回该子窗口的实例,否则返回主窗口本身。
程序清单 2-9:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/28_04.jpg?sign=1738881417-nzD1BCHi0uHCEyyHHK8T2uAwIIaW6p1m-0-fe3702bc3a000514e09fda3b3f32354e)
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/29_01.jpg?sign=1738881417-4MMyLPvKZ2rMeJ0jfsb3jQhW6DsRcgG0-0-5e335c368d1c3ca9ffd7ef38b167e9c4)
2.2.2.3 静态成员和非静态成员
若将类中的某个成员声明为static,该成员称为静态成员。类中的成员要么是静态的要么是非静态的,一般静态成员是属于类所有的,非静态成员则属于类的实例对象。
以下示例代码演示了如何声明静态和非静态成员:
程序清单 2-10:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/29_02.jpg?sign=1738881417-UMBsSlfrU4EGD3U6k1chz29WybTaytQX-0-2b03c0acca8b1771674789050613cd4e)
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/30_01.jpg?sign=1738881417-97QG01JLx32NRjpMR1Z49eURVTHVwBgz-0-b2abf5dee51dae878804037fcd3ade38)
类的非静态成员属于类的实例,每创建一个类的实例都在内存中为非静态成员开辟了一块区域;而类的静态成员属于类,为这个类的所有实例所共享,无论这个类创建了多少个副本,一个静态成员在内存中只占有一块区域。
2.2.2.4 成员常量
再看一个成员常量的声明例子:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/30_02.jpg?sign=1738881417-fws9HhbXMtHPdbnlQMsBrb1UzjZaGskE-0-afb4ae739200658c77845a73271b5ebe)
关键字const用于声明后跟数据类型的常量,可以加上new、public、protected、internal、private修饰符。
可以用一条语句同时声明多个常量,比如上例可以写成:
![](https://epubservercos.yuewen.com/A5BD8D/30213476407413906/epubprivate/OEBPS/Images/30_03.jpg?sign=1738881417-LLftYXbgE7KFSBToQf3GnNHK9p0dGEQy-0-066213a90f64e5f7347d9eeafe7385cb)