既然面向对象编程思想是以类型和对象为基础进行程序开发设计的,那么,如何通过C#语言定义一个类型?这一节,我们来解决这个问题。

类的成员包括:常量,字段,属性,索引器,方法,事件,构造函数和析构函数。在上一节中,我们着重介绍了类的属性和方法,关于常量、字段、索引器、事件和构造函数、析构函数我们将在后面进行讲解。本节课将介绍类型本身的定义、以及属性和方法的定义,旨在了解定义类型的语法结构和注意事项,至于类型的其它成员,我们将以章节的形式一一探讨。

首先定义一个类型需要使用C#关键字class,其次,要修饰这个类型的可见范围,需要用到另一些关键字,比如常用的是public关键字,表示这是一个共开的类型,任何地方都可以使用这个类。

类型可分为静态类和非静态类,区别在于静态类不能实例化,在运行期间,静态类就像独身子女一样,在内存中永远只有一个实例。static关键字可以将一个类型声明成静态的。

最后一点,定义一个类型,必须要指明它的命名空间。命名空间本质上就是这个类型的家庭地址,使用关键字namespace可以定义一个命名空间。一个类型只能拥有一个命名空间,一个命名空间可以容下N个类型。

下面,我们来编写第一个类。我们利用前面的《HelloWorld》项目,在解决方案资源管理器中的Helloworld项目上单击右键-添加-新建项。

C#中如何定义一个类型(class)_命名空间

第二步,在弹出来的对话框中选择类,然后输入类名Person。请注意首字母要大写,也这是C#推荐的命令方式,最后单击添加按钮。

C#中如何定义一个类型(class)_命名空间_02

我们来看一下Visual Studio为了我们默认写了哪些关于类型的代码。

using System;
 
 using System.Collections.Generic;
 
 using System.Linq;
 
 using System.Text;
 
 using System.Threading.Tasks;
 
  
 
 namespace Helloworld
 
 {
 
     internal class Person
 
     {
 
     }
 
 }

代码分析

using 、namespace、internal、class都是C#的关键字,using 在这里表示引入命名空间;namespace表示定义了一个叫Helloworld 的命名空间;internal 用来修饰Person这个自定义类型的可见范围为:只在Helloworld 命名空间内可见;class 表示定义一个类型的声明关键字;Person就是类型的名称。

C#的关键字

我们在这里频繁提到C#的关键字,在学习C#语言之前,先了解C#有哪些关键字是很有必要的。关键字是预定义的保留标识符,对编译器有特殊意义。若需要使用关键字作为标识符,则需要在关键字前面添加@前缀。关键字有两种:一种是C#程序任意部分中的保留标识符的关键字;一种是仅在一部分程序上下文中作为关键字使用,在相应上下文范围之外用作标识符。(注:C#语言中新增的关键字会作为上下文关键字添加,以免破坏用旧版语言编写的程序)。

接下来,我们给这个Person类型写一些属性和方法成员。

namespace Helloworld
 
 {
 
     internal class Person
 
     {
 
         private string name = string.Empty;
 
         public string Name
 
         {
 
             get { return name; }
 
             set { name = value; }
 
         }
 
  
 
         private int age = 0;
 
         public int Age
 
         {
 
             get { return age; }
 
             set { age = value; }
 
         }
 
  
 
         public void Write()
 
         {
 
             Console.WriteLine($"你好,我叫{Name},我今年{Age}岁!");
 
         }
 
     }
 
 }

观察上面的代码,我们只是在Person类的大括号中间添加了一些代码,而这些代码的格式各不相同。

private string name = string.Empty;

这句话表示给Person类定义一个内部字段name,为什么name被称为内部字段?原因有两个,第一个是因为它的修饰符是private,表示后面这个name变量被Person类私有,换句话说,这个name变量只属于Person类型,是它的私有财产,其它类型是不可以使用的,当然,其它类型也看不见它。第二个原因是name变量在声明时,后面没有小括号或大括号,虽然它后面紧跟了一个等号,那只是表示name变量在声明时,同时给它一个初值。string.Empty表示一个空字符串。

在private 和 name中间有一个string,这个表示声明一个字符串的关键字。string是C#提供的一种数据类型,除了string,C#还提供了其它基础数据类型,比如这段源代码下面的int。int表示定义一个32位整型字段,它的范围是-2,147,483,648 到 2,147,483,647。

public string Name
 
 {
 
     get { return name; }
 
     set { name = value; }
 
 }

上面这种写法是C#的属性包装器的写法,这里的Name(首字母大写)表示属性,属性一定是公开的,所以采用public关键安进行声明。Name的数据类型也是string,大括号里面表示属性体,分为get和set两个部分,get表示读取Name属性后返回的值,比如这里直接将字段name返回;set表示写入Name属性时,最终要赋值的内部变量,这里同样直接将新的value值赋值给了name字段。

一个属性同时拥有get和set语句块,表示这个属性可读可写。如果去掉set语句块,则表示这个属性是一个只读属性,反之则表示只写属性。

public void Write()
 
 {
 
     Console.WriteLine($"你好,我叫{Name},我今年{Age}岁!");
 
 }

上面这种写法是C#方法(或称为函数)的写法,它有属性的写法有所不同,第一个public关键字表示这个方法是一个共开的方法,可以在其它类中调这个Person类的方法,第二个void关键字表示这个方法的返回值,如果一个方法执行完了没有返回值,那么在声明这个方法时就写成void,表示返回空值。第三个Write(首字母大写)表示这个方法的名称,后面一对大括号表示方法体,属于Write方法的代码全部都要写在这一对大括号之中,最后,Console.WriteLine($"你好,我叫{Name},我今年{Age}岁!"); 表示Write方法的语句。

当一个类型被程序员设计好之后,下一步就是如何使用这个类型。

——重庆教主 2023年12月11日