设计和使用类

已完成

在面向对象的编程(OOP)中,类是应用程序的构建基块。 了解类和对象之间的关系至关重要。

  • 类是开发人员用来定义对象的属性(数据)和方法(行为)的蓝图。 类提供了一种封装数据和行为的方法,以便更轻松地组织和管理代码。
  • 对象是类的实例。 实例化类时,在内存中创建对象。 每个对象都有自己的一组属性和方法,但共享由类定义的相同结构。

检查周围的实际对象可帮助你了解类和对象在编程中的工作原理。 现实世界中的对象具有用于定义其用途和功能的属性(属性)和行为(方法)。 例如,汽车是一个对象,其属性包括制造、模型和颜色,以及驾驶和停车等行为。

实际对象

人们在日常生活中不断与物体进行交互。 事实上,我们与之交互的几乎一切都可以视为一个对象。

以下条件可用于定义现实世界中的对象:

  • 对象是我们可以看到和触摸的对象。
  • 对象具有用途。
  • 对象具有支持其用途的部分。

铅笔是物理对象的一个示例。 铅笔的目的是创建便笺或绘图。 铅笔的部分包括身体、小费和橡皮擦。 这些部件协同工作,以实现铅笔的预期目的。

还有一些物理对象作为其他对象的程序集存在。 以下列表提供了由其他对象构成的对象的示例:

  • 汽车:汽车的目的是为个人和家庭提供地面运输。 汽车的部分包括发动机、车轮、方向盘等。 汽车的部件协同工作,以实现地面运输。
  • 房子:房子的目的是提供庇护。 房子的部分包括地基、外墙、屋顶和房间。 这些部分协同工作,创造一个生活空间。
  • 智能手机:智能手机的目的是帮助用户完成日常任务和活动。 智能手机的部分包括屏幕、微控制器、内存和存储、电池、相机和按钮。 这些部件协同工作,以实现通信、娱乐和生产力功能。

汽车、房屋或智能手机的每个部分都是具有自身用途的对象,也可能是对象的程序集。

物理对象的属性和功能

花一分钟时间考虑铅笔的示例。 铅笔具有部件(身体、小费、橡皮擦)和用途(创建便笺或绘图)。 铅笔共享这些基本特征。 但是,并非所有铅笔都是相同的。

有些铅笔短,有些是长。 有些铅笔是黄色的,有些是黑色的。 有些铅笔有一个沉闷的小尖,有的有锐化的小尖。 有些铅笔有橡皮擦,有些没有橡皮擦。

对象的属性通常分为以下物理和行为类别:

  • 物理:物理属性是可以看到或测量的对象的各个方面。
  • 行为:行为属性是描述其功能或与其他对象的交互的对象的各个方面。

对于铅笔示例,物理属性包括身体的长度、身体的颜色、尖尖的锐度,以及铅笔是否具有橡皮擦。 行为属性包括写入能力、擦除能力以及锐化能力。 铅笔与可写入或绘制的纸张或其他固体对象进行交互。

物理属性通常称为属性,而行为属性通常称为函数(C# 编程中的方法)。

C# 编程中的代码类和对象

在 C# 编程世界中,对象属性和方法由类定义。 类提供对象(类实例)能够执行的作的蓝图。 类的蓝图称为类定义。

当应用运行时,计算机使用类定义为对象(类的实例)分配内存。 计算机使用蓝图来配置大小正确的内存块。 对象基本上是内存块。

与物理对象一样,代码对象可以为其属性分配不同的值。

类封装数据和行为

类提供了封装数据和行为的方法。 封装是将数据和行为合并到单个单元的过程。 类使用属性来启用对数据和方法的访问以启用行为。

类属性

类属性用于管理将一个对象(类实例)与同一类型的另一个对象区分开的数据。

类属性使对象能够读取、写入或计算类中定义的变量(数据字段)的值。 属性显示为公共数据成员,但它们作为称为 访问器的特殊方法实现。 此功能使调用方能够轻松访问数据,并且仍有助于提升数据安全性和灵活性。

可以使用 get 访问器读取属性值,并使用 set 访问器进行分配。

类方法

类方法定义类可以执行的作(行为)。

方法可以采用提供输入数据的参数,并通过参数返回输出数据。 方法还可以直接返回值,而无需使用参数。

例如,Console 类包括 WriteLineReadLineClear 方法(等等)。 这些方法有助于启用 Console 类的预期行为。 方法可用于执行作,例如计算、数据作或与其他对象的交互。

方法通常设计为接受一个或多个方法参数。 方法参数作为用于调用方法的调用语句的参数传递给该方法。 例如,WriteLine 类的 Console 方法可以接受由调用语句提供的字符串参数。

C# 代码中的类定义

以下示例演示 C# 中的简单类。 Phone 类具有 BrandModelYear的属性。 该类还包括用于 CallText的方法。


public class Phone
{
    public string? Brand { get; set; }
    public string? Model { get; set; }
    public int Year { get; set; }

    public void Call(string phoneNumber)
    {
        Console.WriteLine($"Calling {phoneNumber}...");
    }

    public void Text(string phoneNumber, string message)
    {
        Console.WriteLine($"Texting {phoneNumber}: {message}");
    }
}

使用命名空间

在 C# 编程中,命名空间采用两种方式:

  • .NET 类库使用命名空间来组织其许多类。
  • 开发人员声明自己的命名空间,以帮助控制大型编程项目中的类和方法名称的范围。

.NET 类库中的命名空间

.NET 类库使用命名空间将相关类型组合在一起,以便更轻松地查找和使用它们。

请考虑以下代码片段:


System.Console.WriteLine("Hello World!");

在此示例中,System 是一个命名空间,Console 是该命名空间中的类。

提供类(System.Console)的完全限定名称可确保使用正确的类。 但是,使用同一命名空间中的许多类时,使用完全限定的名称可能很麻烦。 若要提高代码可读性,可以使用 using 指令。 using 指令允许使用命名空间中定义的类型,而无需指定该类型的完全限定命名空间。

以下代码片段实现 using 指令以提高代码可读性:


using System;

Console.WriteLine("Hello World!");

注意

从 .NET 6 开始,隐式global using 指令添加到新的 C# 项目中。 这意味着可以使用在这些命名空间中定义的类型,而无需指定其完全限定的名称或手动添加 using 指令。 隐式 方面是指将全局 using 指令添加到项目的 obj 目录中生成的文件中的事实。 使用此功能可以在 .NET 版本 6.0 或更高版本中开发应用时使用 Console.WriteLine,而无需显式声明 using System

使用命名空间组织类

声明自己的命名空间有助于控制大型编程项目中的类和方法名称的范围。 使用 namespace 关键字声明命名空间。

请考虑以下代码片段:


namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine("SampleMethod inside SampleNamespace");
        }
    }
}

命名空间的名称必须是有效的 C# 标识符名称。

可以为该文件中定义的所有类型声明命名空间,如以下代码片段所示:


namespace SampleNamespace;

class SampleClass
{
    public void SampleMethod()
    {
        System.Console.WriteLine("SampleMethod inside SampleNamespace");
    }
}

class AnotherSampleClass
{
    public void AnotherSampleMethod()
    {
        System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
    }
}

这种新语法的优点是,它更简单,可以节省水平空间和大括号。 这使得代码更易于阅读。

命名空间概述

命名空间具有以下属性:

  • 它们组织大型代码项目。
  • 它们使用 . 运算符进行分隔。
  • using 指令将要求指定每个类的命名空间的名称。
  • 全局命名空间是“根”命名空间:global::System 始终引用 .NET 系统命名空间。

使用命名空间将相关类型组合在一起可以更轻松地查找和使用它们。