一、类的概述在上一篇文章中(C# 中的类型和变量),我们看到 C# 提供了 6 种用户定义类型。其中最重要的,也是首先要阐述的是类。因为类在 C# 中是个很大的主题,所以关于它的讨论将会延伸到接下来的几篇文章。 类是一种活动的数据结构 在面向对象的分析和设计出现之前,程序员们仅把程序当作指令的序列,那时的焦点主要放在指令的组合和优化上。随着面向对象的出现,焦点从优化指令转移到组织程序的数据和功能上来。程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类。 类是一个能存储数据并执行代码的数据结构。它包含数据成员和函数成员。
一个 C# 类可以有任意数目的数据成员和函数成员。成员可以是 9 种成员类型的任意组合。这些成员类型如下表所示。
二、程序和类:一个简单的示例一个运行中的 C# 程序是一组相互作用的类型对象,它们中的大部分是类的实例。例如,假设有一个模拟扑克牌游戏的程序。当程序运行时,它有一个名为
一个真正的程序无疑会包含除
三、声明类或许你能猜到,虽然类型 类的声明定义新类的特征和成员。它并不创建类的实例,但创建用于创建实例的模板。类的声明提供下列内容:
下面是一个最简单的类声明语法示例。大括号内包含了成员的声明,它们组成了类主体。类成员可以在类主体内部以任何顺序声明。这意味着一个成员的声明完全可以引用另一个在后面的类声明中才定义的成员。 下面的代码给出了两个类声明的概貌: class Dealer // 类声明 { ... } class Player // 类声明 { ... }
四、类成员字段和方法是最重要的类成员类型。字段是数据成员,方法是函数成员。 4.1 字段字段是隶属于类的变量。
声明一个字段最简单的语句如下: 例如,下面的类包含字段 class MyClass { int MyField; }
1. 显式和隐式字段初始化 因为字段是一种变量,所以字段初始化语句在语法上和上一篇(C# 中的类型和变量)所述的变量初始化语句相同。
例如,下面的代码声明了 4 个字段,前面两个字段被隐式初始化,另外两个字段被初始化语句显示初始化。 class MyClass { int f1; // 初始化为 0 - 值类型 string f2; // 初始化为 null - 引用类型 int f3 = 25; // 初始化为 25 string f4 = "abcd"; // 初始化为 “abcd” } 2. 声明多个字段 可以通过用逗号分隔名称的方式,在同一条语句中声明多个相同类型的字段。但不能在一个声明中混合不同的类型。例如,可以把之前的 4 个字段声明结合成两条语句,语义结果相同。 int f1,f3 = 25; string f2,f4 = "abcd"; 4.2 方法方法是具有名称的可执行代码块,可以从程序的很多不同地方执行,甚至从其他程序中执行。 当方法被调用(call/invoke)时,它执行自己所含的代码,然后返回到调用它的代码并继续执行调用代码。有些方法返回一个值到它们被调用的位置。方法相当于 C++ 中的成员函数。 声明方法的最简语法包括以下组成部分。
例如,下面的代码声明了一个类,带有一个名为
class SimpleClass { void PrintNums() { Console.WriteLine("1"); Console.WriteLine("2"); } }
五、创建变量和类的实例类的声明只是用于创建类的实例的蓝图。一旦类被声明,就可以创建类的实例。
下图阐明了如何定义保存引用的变量。左边顶端的代码是类 六、为数据分配内存声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存类对象实际数据的。要为实际数据分配内存,需要使用
要分配和初始化用于保存类实例数据的内存,需要的工作就是这些。下面是使用 Dealer theDealer; // 声明引用变量 theDealer = new Dealer(); // 为类对象分配内存并赋值给变量 下图左边的代码展示了用干分配内存并创建类 合并这两个步骤 可以将这两个步骤合并起来,用对象创建表达式来初始化变量。 Dealer theDealer = new Dealer(); // 声明并初始化 七、实例成员类声明相当于蓝图,通过这个蓝图想创建多少个类的实例都可以。
下面的代码是实例成员的示例,展示了有 3 个 class Dealer {...} // 声明类 class Player // 声明类 { string Name; // 字段 ... } class Program { static void Main() { Dealer theDealer = new Dealer(); Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); ... } } 八、访问修饰符从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其他成员。 访问修饰符是成员声明的可选部分,指明程序的其他部分如何访问成员。访问修饰符放在简单声明形式之前。下面是字段和方法声明的语法: 字段 访问修饰符 类型 标识符; 方法 访问修饰符 返回类型 方法名() { ... } 5 种成员访问控制如下。本文将阐述前两种。
私有访问和公有访问 私有成员只能从声明它的类的内部访问,其他的类看不见或无法访问它们。
例如,下面的两个声明都指定了 int MyInt1; // 隐式声明为私有 private int MyInt2; // 显示声明为私有 实例的公有成员可以被程序中的其他对象访问。必须使用 public int MyInt; 1. 公有访问和私有访问图示 本文中的插图把类表示为标签框,如下图所示。
2. 成员访问示例 类 class C1 { int F1; // 隐式私有字段 private int F2; // 显示私有字段 public int F3; // 公有字段 void DoCalc() // 隐式私有方法 { ... } public int GetVal() // 公有方法 { ... } } 九、从类的内部访问成员如前所述,类的成员仅用其他类成员的名称就可以访问它们。 例如,下面的类声明展示了类的方法对字段和其他方法的访问。即时字段和两个方法被声明为 class DaysTemp { // 字段 private int High = 75; private int Low = 45; // 方法 private int GetHigh() { return High; // 访问私有字段 } private int GetLow() { return Low; // 访问私有字段 } public float Average() { return (GetHigh() + GetLow()) / 2; // 访问私有方法 } } 十、从类的外部访问成员要从类的外部访问实例成员,必须包括变量名称和成员名称,中间用句点(.)分隔。这称为点运算符(dot-syntax notation),后文会详细讨论。 例如,下面代码的第二行展示了一个从类的外部访问方法的示例: DaysTemp myDt = new DaysTemp(); // 创建类的对象 float fValue = myDt.Average(); // 从外部访问 举个例子,下面的代码声明了两个类:
class DaysTemp // 声明类 DaysTemp { public int High = 75; public int Low = 45; } class Program // 声明类 Program { static void Main() { DaysTemp temp = new DaysTemp(); // 创建对象 temp.High = 85; // 字段赋值 temp.Low = 60; Console.WriteLine($"High: {temp.High}"); // 读取字段值 Console.WriteLine($"Low: {temp.Low}"); } } 输出: High: 85 Low: 60 十一、综合应用下面的代码创建两个实例并把它们的引用保存在名称为
class DaysTemp // 声明类 { public int High, Low; // 声明实例字段 public int Average() { return (High + Low) / 2; } } class Program { static void Main() { // 创建两个 DaysTemp 实例 DaysTemp t1 = new DaysTemp(); DaysTemp t2 = new DaysTemp(); // 给字段赋值 t1.High = 76; t1.Low = 57; t2.High = 75; t2.Low = 53; // 读取字段值 // 调用实例的方法 Console.WriteLine($"t1: {t1.High}, {t1.Low}, {t1.Average()}"); Console.WriteLine($"t2: {t2.High}, {t2.Low}, {t2.Average()}"); } } 输出: t1: 76, 57, 66 t2: 75, 53, 64 原文链接:C# 中类的基本概念 (完) |
|