多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 类(C# 编程指南) “类”是一种构造,通过使用该构造,您可以将其他类型的变量、方法和事件组合在一起,从而创建自己的自定义类型。类就像一个蓝图,它定义类型的数据和行为。如果类没有声明为静态类,客户端代码就可以创建赋给变量的“对象”或“实例”,从而使用该类。在对变量的所有引用都超出范围之前,该变量始终保持在内存中。所有引用都超出范围时,CLR 将标记该变量以供垃圾回收。如果类声明为[静态](https://msdn.microsoft.com/zh-CN/library/98f28cdx.aspx)类,则内存中只存在一个副本,并且客户端代码只能通过该类自身而不是“实例变量”访问该类。有关更多信息,请参见[静态类和静态类成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/79b3xss3.aspx)。 与结构不同,类支持“继承”,而继承是面向对象编程的基础特性。有关更多信息,请参见[继承(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)。 ## 声明类 类使用 [class](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx) 关键字进行声明,如下面的示例所示: ``` public class Customer { //Fields, properties, methods and events go here... } ``` **class** 关键字前面是访问级别。由于在该例中使用 [public](https://msdn.microsoft.com/zh-CN/library/yzh058ae.aspx),因此任何人都可以基于该类创建对象。类的名称位于 **class** 关键字的后面。定义的其余部分是类的主体,用于定义行为和数据。类的字段、属性、方法和事件统称为“类成员”。 ## 创建对象 尽管有时类和对象可互换,但它们是不同的概念。类定义对象的类型,但它不是对象本身。对象是基于类的具体实体,有时称为类的实例。 通过使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx) 关键字(后跟对象将基于的类的名称)可以创建对象,如下所示: ``` Customer object1 = new Customer(); ``` 创建类的实例后,将向程序员传递回对该对象的引用。在前面的示例中,object1 是对基于 Customer 的对象的引用。此引用引用新对象,但不包含对象数据本身。实际上,可以在根本不创建对象的情况下创建对象引用: ``` Customer object2; ``` 建议不要创建像这样的不引用对象的对象引用,因为在运行时通过这样的引用来访问对象的尝试将会失败。但是,可以创建这样的引用来引用对象,方法是创建新对象,或者将它分配给现有的对象,如下所示: ``` Customer object3 = new Customer(); Customer object4 = object3; ``` 此代码创建了两个对象引用,它们引用同一个对象。因此,通过 object3 对对象所做的任何更改都将反映在随后使用的 object4 中。由于基于类的对象是按引用来引用的,因此类称为引用类型。 ## 类继承 继承是通过使用“派生”来实现的,而派生意味着类是使用“基类”声明的,它的数据和行为从基类继承。通过在派生的类名后面追加冒号和基类名称,可以指定基类,如下所示: ``` public class Manager : Employee { // Employee fields, properties, methods and events are inherited // New Manager fields, properties, methods and events go here... } ``` 当类声明基类时,它继承基类除构造函数以外的所有成员。 与 C++ 不同,C# 中的类只能直接从一个基类继承。但是,因为基类自身也可能继承自另一个类,所以类可以间接继承多个基类。而且,一个类可以直接实现一个以上的接口。有关更多信息,请参见[接口(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173156.aspx)。 类可以声明为[抽象](https://msdn.microsoft.com/zh-CN/library/sf985hc5.aspx)类。抽象类包含具有签名定义但没有实现的抽象方法。抽象类不能进行实例化。只能通过实现抽象方法的派生类使用抽象类。相比之下,[密封](https://msdn.microsoft.com/zh-CN/library/88c54tsw.aspx)类不允许其他类从其派生。有关更多信息,请参见[抽象类、密封类及类成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。 类定义可在不同的源文件之间进行拆分。有关更多信息,请参见[分部类和方法(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/wa80x488.aspx)。 ## 描述 下面的示例中定义了一个公共类,其中包含一个字段、一个方法和一个称为构造函数的特殊方法。有关更多信息,请参见[构造函数(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ace5hbzh.aspx)。然后使用 **new** 关键字将该类实例化。 ``` public class Person { // Field public string name; // Constructor that takes no arguments. public Person() { name = "unknown"; } // Constructor that takes one argument. public Person(string nm) { name = nm; } // Method public void SetName(string newName) { name = newName; } } class TestPerson { static void Main() { // Call the constructor that has no parameters. Person person1 = new Person(); Console.WriteLine(person1.name); person1.SetName("John Smith"); Console.WriteLine(person1.name); // Call the constructor that has one parameter. Person person2 = new Person("Sarah Jones"); Console.WriteLine(person2.name); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } // Output: // unknown // John Smith // Sarah Jones ``` ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 编程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [面向对象的编程(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/dd460654.aspx) [多态性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173152.aspx) [成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173113.aspx) [方法(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173114.aspx) [构造函数(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ace5hbzh.aspx) [析构函数(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/66x5fx1b.aspx) [对象(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173110.aspx)