类使用 class 关键字声明。采用的形式为::
[attributes] [modifiers] class identifier [:base-list] { class-body }[;]
其中:
-
attributes(可选)
- 附加的声明性信息。有关属性和属性类的更多信息,请参见 17. 属性。 modifiers(可选)
- 允许的修饰符为 new、 abstract、 sealed 和四个 访问修饰符。 identifier
- 类名。 base-list(可选)
- 包含一个基类和任何实现的接口的列表,各项之间由逗号分隔。 class-body
- 类成员的声明。
备注
与 C++ 不同,C# 中仅允许单个继承。也就是说,类只能从一个基类继承实现。但是,一个类可以实现一个以上的接口。下表给出了类继承和接口实现的一些示例:
继承 | 示例 |
---|---|
无 | class ClassA { } |
单个 | class DerivedClass: BaseClass { } |
无,继承两个接口 | class ImplClass: IFace1, IFace2 { } |
单个,继承一个接口 | class ImplDerivedClass: BaseClass, IFace1 { } |
只有嵌套类允许访问级别 protected 和 private。
一个类可包含下列成员的声明:
- 构造函数(请参见构造函数和析构函数、10.10 实例构造函数)
- 析构函数(请参见析构函数、10.12 析构函数)
- 常数(请参见 10.3 常数)
- 字段(请参见 10.4 字段)
- 方法(请参见 10.5 方法)
- 属性(请参见属性、10.6 属性)
- 索引器(请参见索引器、10.8 索引器)
- 运算符(请参见 C# 运算符、10.9 运算符)
- 事件(请参见事件、10.7 事件)
- 委托(请参见 delegate、15. 委托)
- 类(请参见 10. 类)
- 接口(请参见 interface、13. 接口)
- 结构(请参见 struct、11. 结构)
在 C++ 的托管扩展中,与 C# 类和 C# 结构等效的类和结构如下所示:
示例
下面举例说明如何声明类的字段、构造函数和方法。该例还说明了如何实例化对象及如何打印实例数据。在此例中声明了两个类,一个是 Kid
类,它包含两个私有字段(name
和 age
)和两个公共方法。另一个是用于数据处理的 MainClass
类。
// keyword_class.cs // class example using System; public class Kid { private int age; private string name; // Default constructor: public Kid() { name = "N/A"; } // Constructor: public Kid(string name, int age) { this.name = name; this.age = age; } // Printing method: public void PrintKid() { Console.WriteLine("{0}, {1} years old.", name, age); } } public class MainClass { public static void Main() { // Create objects // Objects must be created using the new operator: Kid kid1 = new Kid("Craig", 11); Kid kid2 = new Kid("Sally", 10); // Create an object using the default constructor: Kid kid3 = new Kid(); // Display results: Console.Write("Kid #1: "); kid1.PrintKid(); Console.Write("Kid #2: "); kid2.PrintKid(); Console.Write("Kid #3: "); kid3.PrintKid(); } }
输出
Kid #1: Craig, 11 years old. Kid #2: Sally, 10 years old. Kid #3: N/A, 0 years old.
注意:在上例中,私有字段(name
和 age
)只能通过 Kid
类的公共方法访问。例如,不能通过 Main
方法用如下语句打印小孩的姓名:
Console.Write(kid1.name); // Error
但是,如果 Main
方法是 Kid
类的一个成员,则此操作是可行的。
还请注意:private 修饰符是类成员的默认修饰符。如果移除了该修饰符,仍然会得到私有成员。有关访问级别修饰符的更多信息,请参见访问修饰符。
还请注意:对于使用默认构造函数 (kid3
) 创建的对象,年龄字段被初始化为零。
有关类的更多信息,请参见 10. 类。
请参见
属性是类、结构和接口的命名成员。它们提供了通过访问器读、写或计算私有字段值的灵活机制。
属性是字段的扩展并通过相同的语法来访问。与字段不同,属性不指定存储位置。相反,属性通过访问器来读写或计算它们的值。