C# 7.0 核心技术指南 (17):C#语言基础 2.3.2

阅读数:6 2019 年 11 月 30 日 23:32

C# 7.0核心技术指南(17):C#语言基础 2.3.2

(自定义类型示例)

内容简介
本书前三章将集中介绍 C#语言。首先介绍基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是 C#语言的初学者,请循序渐进地阅读这些章节。
其余各章则涵盖了.NET Framework 的核心功能,包括 LINQ、XML、集合、并发、I/O 和网络、内存管理、反射、动态编程、特性、安全、应用程序域和原生互操作性等主题。第 6 章和第 7 章是后续主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ 相关的三个章节好按顺序阅读。其中的一些章节需要一些并发相关的知识,这些知识将在第 14 章中介绍。

我们能使用简单函数来构造复杂函数,同样也可以使用基元类型来构建复杂类型。以下示例定义了一个名为 UnitConverter 的自定义类型。这个类将作为单位转换的蓝图:

复制代码
using System;
public class UnitConverter
{
int ratio; // Field
public UnitConverter (int unitRatio) {ratio = unitRatio; } // Constructor
public int Convert (int unit) {return unit * ratio; } // Method
}
class Test
{
static void Main()
{
UnitConverter feetToInchesConverter = new UnitConverter (12);
UnitConverter milesToFeetConverter = new UnitConverter (5280);
Console.WriteLine (feetToInchesConverter.Convert(30)); // 360
Console.WriteLine (feetToInchesConverter.Convert(100)); // 1200
Console.WriteLine (feetToInchesConverter.Convert(
milesToFeetConverter.Convert(1))); // 63360
}
}

2.3.2.1 类型的成员

类型包含数据成员和函数成员。UnitConverter 的数据成员是 ratio 字段,函数成员是 Convert 方法和 UnitConverter 的构造器。

2.3.2.2 预定义类型和自定义类型

C#的优点之一是其中的预定义类型和自定义类型非常相近。预定义 int 类型是整数的蓝图。它保存了 32 位的数据,提供像 ToString 这种函数成员来使用这些数据。类似地,我们自定义的 UnitConverter 类型也是单位转换的蓝图。它保存比率数据,还提供了函数成员来使用这些数据。

2.3.2.3 构造器和实例化

将类型实例化即可创建数据。预定义类型可以简单地通过字面量进行实例化,例如 12 或 "Hello World"。而自定义类型则需要使用 new 运算符来创建实例。以下的语句创建并声明了一个 UnitConverter 类型的实例:

复制代码
UnitConverter feetToInchesConverter = new UnitConverter (12);

使用 new 运算符后会立刻实例化一个对象,调用对象的构造器进行初始化。构造器的定义像方法一样,不同的是方法名和返回类型简化为所属的类型名称:

复制代码
public class UnitConverter
{
...
public UnitConverter (int unitRatio) { ratio = unitRatio; }
...
}

2.3.2.4 实例与静态成员

由类型的实例操作的数据成员和函数成员称为实例成员。UnitConverter 的 Convert 方法和 int 的 ToString 方法就是实例成员的例子。在默认情况下,成员就是实例成员。

那些不是由类型的实例操作,而是由类型本身操作的数据成员和函数成员必须标记为 static。Test.Main 和 Console.WriteLine 就是静态方法。事实上,Console 类是一个静态类,它的所有成员都是静态的。由于 Console 类型无法实例化,因此控制台将在整个应用程序内共享使用。

我们来对比实例成员和静态成员。在下面的代码中,实例字段 Name 属于特定的 Panda 实例,而 Population 则属于所有 Panda 实例:

复制代码
public class Panda
{
public string Name; // Instance field
public static int Population; // Static field
public Panda (string n) // Constructor
{
Name = n; // Assign the instance field
Population = Population + 1; // Increment the static Population field
}
}

下面的代码创建了两个 Panda 实例,先打印它们的名字,再打印总数:

复制代码
using System;
class Test
{
static void Main()
{
Panda p1 = new Panda ("Pan Dee");
Panda p2 = new Panda ("Pan Dah");
Console.WriteLine (p1.Name); // Pan Dee
Console.WriteLine (p2.Name); // Pan Dah
Console.WriteLine (Panda.Population); // 2
}
}

如果试图求 p1.Population 或者 Panda.Name 的值,则会生成一个编译时错误。

2.3.2.5 public 关键字

public 关键字将成员公开给其他类。在上述示例中,如果 Panda 类中的 Name 字段没有标记为公有(public)的,那么它就是私有的,且 Test 类就不能访问它。将成员标记为 public 就是类型的通信手段:“这就是我想让其他类型看到的,而其他的都是我私有的实现细节。”在面向对象的术语中,称之为类的公有成员封装了私有成员。

C# 7.0核心技术指南(17):C#语言基础 2.3.2

购书地址 https://item.jd.com/12681788.html?dist=jd

评论

发布