# 继承(C# 编程指南)
继承(加上封装和多态性)是面向对象的编程的三个主要特性(也称为“支柱”)之一。 继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。派生类只能有一个直接基类。但是,继承是可传递的。如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
| ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 |
| :-- |
| 结构不支持继承,但可以实现接口。有关更多信息,请参见 [接口(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173156.aspx)。 |
从概念上来说,派生类是基类的特例。 例如,如果您有一个基类 Animal,则可以有一个名为 Mammal 的派生类和一个名为 Reptile 的派生类。 Mammal 是一个 Animal,Reptile 也是一个 Animal,但每个派生类均表示基类的不同专用化。
定义一个类从其他类派生时,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。因此,派生类可以重用基类中的代码而无需重新实现这些代码。可以在派生类中添加更多成员。派生类以这种方式扩展基类的功能。
下图演示一个 WorkItem 类,该类表示某业务流程中的一个工作项。和所有的类一样,该类派生自 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 并继承其所有方法。 WorkItem 添加了自己的五个成员。其中包括一个构造函数,因为构造函数不能继承。类ChangeRequest 继承自 WorkItem 并表示特定种类的工作项。 ChangeRequest 在它从 WorkItem 和 [Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 继承的成员中另外添加了两个成员。它必须添加其自己的构造函数,还添加 originalItemID。利用属性 originalItemID,可将 ChangeRequest 实例与更改请求将应用到的原始 WorkItem 相关联。
![类继承](https://i-msdn.sec.s-msft.com/dynimg/IC376124.jpeg "类继承")
类继承
下面的示例演示如何以 C# 表示上图所示的类关系。该示例还演示 WorkItem 如何重写虚方法 [Object.ToString](https://msdn.microsoft.com/zh-CN/library/system.object.tostring.aspx),以及 ChangeRequest 类如何继承该方法的 WorkItem 实现。
```
// WorkItem implicitly inherits from the Object class.
public class WorkItem
{
// Static field currentID stores the job ID of the last WorkItem that
// has been created.
private static int currentID;
//Properties.
protected int ID { get; set; }
protected string Title { get; set; }
protected string Description { get; set; }
protected TimeSpan jobLength { get; set; }
// Default constructor. If a derived class does not invoke a base-
// class constructor explicitly, the default constructor is called
// implicitly.
public WorkItem()
{
ID = 0;
Title = "Default title";
Description = "Default description.";
jobLength = new TimeSpan();
}
// Instance constructor that has three parameters.
public WorkItem(string title, string desc, TimeSpan joblen)
{
this.ID = GetNextID();
this.Title = title;
this.Description = desc;
this.jobLength = joblen;
}
// Static constructor to initialize the static member, currentID. This
// constructor is called one time, automatically, before any instance
// of WorkItem or ChangeRequest is created, or currentID is referenced.
static WorkItem()
{
currentID = 0;
}
protected int GetNextID()
{
// currentID is a static field. It is incremented each time a new
// instance of WorkItem is created.
return ++currentID;
}
// Method Update enables you to update the title and job length of an
// existing WorkItem object.
public void Update(string title, TimeSpan joblen)
{
this.Title = title;
this.jobLength = joblen;
}
// Virtual method override of the ToString method that is inherited
// from System.Object.
public override string ToString()
{
return String.Format("{0} - {1}", this.ID, this.Title);
}
}
// ChangeRequest derives from WorkItem and adds a property (originalItemID)
// and two constructors.
public class ChangeRequest : WorkItem
{
protected int originalItemID { get; set; }
// Constructors. Because neither constructor calls a base-class
// constructor explicitly, the default constructor in the base class
// is called implicitly. The base class must contain a default
// constructor.
// Default constructor for the derived class.
public ChangeRequest() { }
// Instance constructor that has four parameters.
public ChangeRequest(string title, string desc, TimeSpan jobLen,
int originalID)
{
// The following properties and the GetNexID method are inherited
// from WorkItem.
this.ID = GetNextID();
this.Title = title;
this.Description = desc;
this.jobLength = jobLen;
// Property originalItemId is a member of ChangeRequest, but not
// of WorkItem.
this.originalItemID = originalID;
}
}
class Program
{
static void Main()
{
// Create an instance of WorkItem by using the constructor in the
// base class that takes three arguments.
WorkItem item = new WorkItem("Fix Bugs",
"Fix all bugs in my code branch",
new TimeSpan(3, 4, 0, 0));
// Create an instance of ChangeRequest by using the constructor in
// the derived class that takes four arguments.
ChangeRequest change = new ChangeRequest("Change Base Class Design",
"Add members to the class",
new TimeSpan(4, 0, 0),
1);
// Use the ToString method defined in WorkItem.
Console.WriteLine(item.ToString());
// Use the inherited Update method to change the title of the
// ChangeRequest object.
change.Update("Change the Design of the Base Class",
new TimeSpan(4, 0, 0));
// ChangeRequest inherits WorkItem's override of ToString.
Console.WriteLine(change.ToString());
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
1 - Fix Bugs
2 - Change the Design of the Base Class
*/
```
## 抽象方法和虚方法
当基类将方法声明为 [virtual](https://msdn.microsoft.com/zh-CN/library/9fkccyh4.aspx) 时,派生类可以用自己的实现[重写](https://msdn.microsoft.com/zh-CN/library/ebca9ah3.aspx)该方法。如果基类将成员声明为 [abstract](https://msdn.microsoft.com/zh-CN/library/sf985hc5.aspx),则在直接继承自该类的任何非抽象类中都必须重写该方法。如果派生类自身是抽象的,则它继承抽象成员而不实现它们。抽象成员和虚成员是多态性的基础,多态性是面向对象的编程的第二个主要特性。有关更多信息,请参见 [多态性(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173152.aspx)。
## 抽象基类
如果希望禁止通过 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx)关键字直接进行实例化,可以将类声明为[abstract](https://msdn.microsoft.com/zh-CN/library/sf985hc5.aspx)如果这样做,则仅当从该类派生新类时才能使用该类。抽象类可以包含一个或多个自身声明为抽象的方法签名。这些签名指定参数和返回值,但没有实现(方法体)。抽象类不必包含抽象成员;但是,如果某个类确实包含抽象成员,则该类自身必须声明为抽象类。自身不是抽象类的派生类必须为抽象基类中的任何抽象方法提供实现。有关更多信息,请参见 [抽象类、密封类及类成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。
## 接口
“接口”是一种引用类型,有点像仅包含抽象成员的抽象基类。类在从接口实现时必须为该接口的所有成员提供实现。类虽然只能从一个直接基类派生,但可以实现多个接口。
接口用于为不一定具有“是”关系的类定义特定功能。例如,[System.IEquatable<T>](https://msdn.microsoft.com/zh-CN/library/ms131187.aspx) 接口可由任何类或构造实现,这些类或构造必须启用代码来确定该类型的两个对象是否等效(但是该类型定义等效性)。 [IEquatable<T>](https://msdn.microsoft.com/zh-CN/library/ms131187.aspx) 不表示基类和派生类之间存在的同一种“是”关系(例如 Mammal 是 Animal)。有关更多信息,请参见 [接口(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173156.aspx)。
## 派生类对基类成员的访问
派生类可以访问基类的公共成员、受保护成员、内部成员和受保护内部成员。即使派生类继承基类的私有成员,仍不能访问这些成员。但是,所有这些私有成员在派生类中仍然存在,且执行与基类自身中相同的工作。例如,假定一个受保护基类方法访问私有字段。要使继承的基类方法正常工作,派生类中必须有该字段。
## 禁止进一步派生
类可以将自身或其成员声明为 [sealed](https://msdn.microsoft.com/zh-CN/library/88c54tsw.aspx),从而禁止其他类从该类自身或其任何成员继承。有关更多信息,请参见 [抽象类、密封类及类成员(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。
## 派生类隐藏基类成员
派生类可以通过以相同的名称和签名声明基类成员来隐藏这些成员。可以使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx) 修饰符显式指示成员不作为基类成员的重写。不是必须要使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx),但如果不使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx),将生成编译器警告。有关更多信息,请参见[使用 Override 和 New 关键字进行版本控制(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/6fawty39.aspx)和 [了解何时使用 Override 和 New 关键字(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173153.aspx)。
## 请参阅
[C# 编程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx)
[类和结构(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx)
[class(C# 参考)](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)
[struct(C# 参考)](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)
- C# 编程指南
- 在 C# 程序内部
- Hello World -- 您的第一个程序(C# 编程指南)
- C# 程序的通用结构(C# 编程指南)
- C# 编码约定(C# 编程指南)
- 数组(C# 编程指南)
- 作为对象的数组(C# 编程指南)
- 一维数组(C# 编程指南)
- 多维数组(C# 编程指南)
- 交错数组(C# 编程指南)
- 对数组使用 foreach(C# 编程指南)
- 将数组作为参数传递(C# 编程指南)
- 使用 ref 和 out 传递数组(C# 编程指南)
- 隐式类型的数组(C# 编程指南)
- 类和结构(C# 编程指南)
- 类(C# 编程指南)
- 对象(C# 编程指南)
- 结构(C# 编程指南)
- 继承(C# 编程指南)
- 多态性(C# 编程指南)
- 抽象类、密封类及类成员(C# 编程指南)
- 静态类和静态类成员(C# 编程指南)
- 成员(C# 编程指南)
- 访问修饰符(C# 编程指南)
- 字段(C# 编程指南)
- 常量(C# 编程指南)
- 属性(C# 编程指南)
- 方法(C# 编程指南)
- 构造函数(C# 编程指南)
- 析构函数(C# 编程指南)
- 对象和集合初始值设定项(C# 编程指南)
- 如何:使用 foreach 访问集合类(C# 编程指南)
- 嵌套类型(C# 编程指南)
- 分部类和方法(C# 编程指南)
- 匿名类型(C# 编程指南)
- 委托(C# 编程指南)
- 使用委托(C# 编程指南)
- 带有命名方法的委托与带有匿名方法的委托(C# 编程指南)
- 如何:合并委托(多路广播委托)(C# 编程指南)
- 如何:声明、实例化和使用委托(C# 编程指南)
- 枚举类型(C# 编程指南)
- 事件(C# 编程指南)
- 如何:订阅和取消订阅事件(C# 编程指南)
- 如何:发布符合 .NET Framework 准则的事件(C# 编程指南)
- 如何:在派生类中引发基类事件(C# 编程指南)
- 如何:实现接口事件(C# 编程指南)
- 如何:使用字典存储事件实例(C# 编程指南)
- 如何:实现自定义事件访问器(C# 编程指南)
- 异常和异常处理(C# 编程指南)
- 使用异常(C# 编程指南)
- 异常处理(C# 编程指南)
- 创建和引发异常(C# 编程指南)
- 编译器生成的异常(C# 编程指南)
- 如何:使用 try/catch 处理异常(C# 编程指南)
- 如何:使用 finally 执行清理代码(C# 编程指南)
- 如何:捕捉非 CLS 异常
- 文件系统和注册表(C# 编程指南)
- 如何:循环访问目录树(C# 编程指南)
- 如何:获取有关文件、文件夹和驱动器的信息(C# 编程指南)
- 如何:创建文件或文件夹(C# 编程指南)
- 如何:复制、删除和移动文件和文件夹(C# 编程指南)
- 如何:提供文件操作进度对话框(C# 编程指南)
- 如何:写入文本文件(C# 编程指南)
- 如何:读取文本文件中的内容(C# 编程指南)
- 如何:一次一行地读取文本文件 (Visual C#)
- 如何:在注册表中创建注册表项 (Visual C#)
- 泛型(C# 编程指南)
- 泛型介绍(C# 编程指南)
- 泛型的优点(C# 编程指南)
- 泛型类型参数(C# 编程指南)
- 类型参数的约束(C# 编程指南)
- 泛型类(C# 编程指南)
- 泛型接口(C# 编程指南)
- 泛型方法(C# 编程指南)
- 泛型和数组(C# 编程指南)
- 泛型委托(C# 编程指南)
- 泛型代码中的默认关键字(C# 编程指南)
- C++ 模板和 C# 泛型之间的区别(C# 编程指南)
- 运行时中的泛型(C# 编程指南)
- .NET Framework 类库中的泛型(C# 编程指南)
- 泛型和反射(C# 编程指南)
- 泛型和特性(C# 编程指南)
- 索引器(C# 编程指南)
- 使用索引器(C# 编程指南)
- 接口中的索引器(C# 编程指南)
- 属性和索引器之间的比较(C# 编程指南)
- 接口(C# 编程指南)
- 显式接口实现(C# 编程指南)
- 如何:显式实现接口成员(C# 编程指南)
- 如何:显式实现两个接口的成员(C# 编程指南)
- 互操作性(C# 编程指南)
- 互操作性概述(C# 编程指南)
- 如何:通过使用 Visual C# 功能访问 Office 互操作对象(C# 编程指南)
- 如何:在 COM 互操作编程中使用索引属性(C# 编程指南)
- 如何:使用平台调用播放波形文件(C# 编程指南)
- 演练:Office 编程(C# 和 Visual Basic)
- COM 类示例(C# 编程指南)
- LINQ 查询表达式(C# 编程指南)
- 查询表达式基础(C# 编程指南)
- 如何:在 C# 中编写 LINQ 查询
- 如何:查询对象集合(C# 编程指南)
- 如何:从方法中返回查询(C# 编程指南)
- 如何:在内存中存储查询结果(C# 编程指南)
- 如何:对查询结果进行分组(C# 编程指南)
- 如何:创建嵌套组(C# 编程指南)
- 如何:对分组操作执行子查询(C# 编程指南)
- 如何:按连续键对结果进行分组(C# 编程指南)
- 如何:在运行时动态指定谓词筛选器(C# 编程指南)
- 如何:执行内部联接(C# 编程指南)
- 如何:执行分组联接(C# 编程指南)
- 如何:执行左外部联接(C# 编程指南)
- 如何:对 Join 子句的结果进行排序(C# 编程指南)
- 如何:使用复合键进行联接(C# 编程指南)
- 如何:执行自定义联接操作(C# 编程指南)
- 如何:在查询表达式中处理 Null 值(C# 编程指南)
- 如何:在查询表达式中处理异常(C# 编程指南)
- Main() 和命令行参数(C# 编程指南)
- 命令行参数(C# 编程指南)
- 如何:显示命令行参数(C# 编程指南)
- 如何:使用 foreach 访问命令行参数(C# 编程指南)
- Main() 返回值(C# 编程指南)
- 命名空间(C# 编程指南)
- 使用命名空间(C# 编程指南)
- 如何:使用全局命名空间别名(C# 编程指南)
- 如何:使用 My 命名空间(C# 编程指南)
- 可以为 null 的类型(C# 编程指南)
- 使用可以为 null 的类型(C# 编程指南)
- 装箱可以为 null 的类型(C# 编程指南)
- 如何:标识可以为 null 的类型(C# 编程指南)
- 如何:安全地将 bool? 强制转换为 bool(C# 编程指南)
- 语句、表达式和运算符(C# 编程指南)
- 语句(C# 编程指南)
- 表达式(C# 编程指南)
- 运算符(C# 编程指南)
- 匿名函数(C# 编程指南)
- 可重载运算符(C# 编程指南)
- 转换运算符(C# 编程指南)
- 如何:使用运算符重载创建复数类(C# 编程指南)
- 相等比较(C# 编程指南)
- 字符串(C# 编程指南)
- 如何:串联多个字符串(C# 编程指南)
- 如何:修改字符串内容(C# 编程指南)
- 如何:比较字符串(C# 编程指南)
- 如何:拆分字符串(C# 编程指南)
- 如何:使用字符串方法搜索字符串(C# 编程指南)
- 如何:使用正则表达式搜索字符串(C# 编程指南)
- 如何:确定字符串是否表示数值(C# 编程指南)
- 如何:将字符串转换为 DateTime(C# 编程指南)
- 如何:在旧式编码与 Unicode 之间转换(C# 编程指南)
- 如何:将 RTF 转换为纯文本(C# 编程指南)
- 类型(C# 编程指南)
- 强制转换和类型转换(C# 编程指南)
- 装箱和取消装箱(C# 编程指南)
- 使用类型 dynamic(C# 编程指南)
- 如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南)
- 如何:将字节数组转换为 int(C# 编程指南)
- 如何:将字符串转换为数字(C# 编程指南)
- 如何:在十六进制字符串与数值类型之间转换(C# 编程指南)
- 不安全代码和指针(C# 编程指南)
- 固定大小的缓冲区(C# 编程指南)
- 指针类型(C# 编程指南)
- XML 文档注释(C# 编程指南)
- 建议的文档注释标记(C# 编程指南)
- 处理 XML 文件(C# 编程指南)
- 文档标记的分隔符(C# 编程指南)
- 如何:使用 XML 文档功能(C# 编程指南)
- C# 参考
- C# 关键字
- 类型(C# 参考)
- 值类型(C# 参考)
- bool(C# 参考)
- byte(C# 参考)
- char(C# 参考)
- decimal(C# 参考)
- double(C# 参考)
- enum(C# 参考)
- float(C# 参考)
- int(C# 参考)
- long(C# 参考)
- sbyte(C# 参考)
- short(C# 参考)
- struct(C# 参考)
- uint(C# 参考)
- ulong(C# 参考)
- ushort(C# 参考)
- 引用类型(C# 参考)
- class(C# 参考)
- 委托(C# 参考)
- dynamic(C# 参考)
- 接口(C# 参考)
- object(C# 参考)
- string(C# 参考)
- 内插字符串(C# 和 Visual Basic 引用)
- void(C# 参考)
- var(C# 参考)
- 类型参考表(C# 参考)
- 内置类型表(C# 参考)
- 整型表(C# 参考)
- 浮点型表(C# 参考)
- 默认值表(C# 参考)
- 值类型表(C# 参考)
- 隐式数值转换表(C# 参考)
- 显式数值转换表(C# 参考)
- 设置数值结果表的格式(C# 参考)
- 修饰符(C# 参考)
- 访问修饰符(C# 参考)
- 可访问性级别(C# 参考)
- 可访问域(C# 参考)
- 可访问性级别的使用限制(C# 参考)
- internal(C# 参考)
- private(C# 参考)
- protected(C# 参考)
- public(C# 参考)
- abstract(C# 参考)
- async(C# 参考)
- const(C# 参考)
- event(C# 参考)
- extern(C# 参考)
- in(泛型修饰符)(C# 参考)
- out(泛型修饰符)(C# 参考)
- override(C# 参考)
- readonly(C# 参考)
- sealed(C# 参考)
- static(C# 参考)
- unsafe(C# 参考)
- virtual(C# 参考)
- volatile(C# 参考)
- 语句关键字(C# 参考)
- 选择语句(C# 参考)
- if-else(C# 参考)
- switch(C# 参考)
- 迭代语句(C# 参考)
- do(C# 参考)
- for(C# 参考)
- foreach,in(C# 参考)
- while(C# 参考)
- 跳转语句(C# 参考)
- break(C# 参考)
- continue(C# 参考)
- goto(C# 参考)
- return(C# 参考)
- 异常处理语句(C# 参考)
- throw(C# 参考)
- try-catch(C# 参考)
- try-finally(C# 参考)
- try-catch-finally(C# 参考)
- Checked 和 Unchecked(C# 参考)
- checked(C# 参考)
- unchecked(C# 参考)
- fixed 语句(C# 参考)
- “锁定”语句(C# 参考)
- 方法参数(C# 参考)
- params(C# 参考)
- ref(C# 参考)
- out(C# 参考)
- out 参数修饰符(C# 参考)
- 命名空间关键字(C# 参考)
- 命名空间(C# 参考)
- using(C# 参考)
- using 指令(C# 参考)
- using 语句(C# 参考)
- 外部别名(C# 参考)
- 运算符关键字(C# 参考)
- as(C# 参考)
- await(C# 参考)
- is(C# 参考)
- new(C# 参考)
- new 运算符(C# 参考)
- new 修饰符(C# 参考)
- new 约束(C# 参考)
- sizeof(C# 参考)
- typeof(C# 参考)
- true(C# 参考)
- true 运算符(C# 参考)
- true 字面常数(C# 参考)
- false(C# 参考)
- false 运算符(C# 参考)
- false 字面常数(C# 参考)
- stackalloc(C# 参考)
- nameof(C# 和 Visual Basic 引用)
- 转换关键字(C# 参考)
- explicit(C# 参考)
- implicit(C# 参考)
- 运算符(C# 参考)
- 访问关键字(C# 参考)
- base(C# 参考)
- this(C# 参考)
- 文字关键字(C# 参考)
- null(C# 参考)
- default(C# 参考)
- 上下文关键字(C# 参考)
- add(C# 参考)
- get(C# 参考)
- global(C# 参考)
- 分部(类型)(C# 参考)
- 分部(方法)(C# 参考)
- remove(C# 参考)
- set(C# 参考)
- where(泛型类型约束)(C# 参考)
- value(C# 参考)
- yield(C# 参考)
- 查询关键字(C# 参考)
- from 子句(C# 参考)
- where 子句(C# 参考)
- select 子句(C# 参考)
- group 子句(C# 参考)
- into(C# 参考)
- orderby 子句(C# 参考)
- join 子句(C# 参考)
- let 子句(C# 参考)
- ascending(C# 参考)
- descending(C# 参考)
- on(C# 参考)
- equals(C# 参考)
- by(C# 参考)
- in(C# 参考)
- C# 运算符
- 运算符(C# 参考)
- () 运算符(C# 参考)
- . 运算符(C# 参考)
- :: 运算符(C# 参考)
- + 运算符(C# 参考)
- - 运算符(C# 参考)
- * 运算符(C# 参考)
- / 运算符(C# 参考)
- % 运算符(C# 参考)
- & 运算符(C# 参考)
- | 运算符(C# 参考)
- ^ 运算符(C# 参考)
- ! 运算符(C# 参考)
- ~ 运算符(C# 参考)
- = 运算符(C# 参考)
- &lt; 运算符(C# 参考)
- &gt; 运算符(C# 参考)
- ?: 运算符(C# 参考)
- ++ 运算符(C# 参考)
- -- 运算符(C# 参考)
- && 运算符(C# 参考)
- || 运算符(C# 参考)
- &lt;&lt; 运算符(C# 参考)
- &gt;&gt; 运算符(C# 参考)
- == 运算符(C# 参考)
- != 运算符(C# 参考)
- &lt;= 运算符(C# 参考)
- &gt;= 运算符(C# 参考)
- += 运算符(C# 参考)
- -= 运算符(C# 参考)
- *= 运算符(C# 参考)
- /= 运算符(C# 参考)
- %= 运算符(C# 参考)
- &= 运算符(C# 参考)
- |= 运算符(C# 参考)
- ^= 运算符(C# 参考)
- &lt;&lt;= 运算符(C# 参考)
- &gt;&gt;= 运算符(C# 参考)
- -&gt; 运算符(C# 参考)
- ?? 运算符(C# 参考)
- =&gt; 运算符(C# 参考)
- NULL 条件运算符(C# 和 Visual Basic)
- C# 预处理器指令
- #if(C# 参考)
- #else(C# 参考)
- #elif(C# 参考)
- #endif(C# 参考)
- #define(C# 参考)
- #undef(C# 参考)
- #warning(C# 参考)
- #error(C# 参考)
- #line(C# 参考)
- #region(C# 参考)
- #endregion(C# 参考)
- #pragma(C# 参考)
- #pragma warning(C# 参考)
- #pragma checksum(C# 参考)
- C# Compiler Options
- Command-line Building With csc.exe
- How to: Set Environment Variables for the Visual Studio Command Line
- Deployment of C# Applications
- C# Compiler Options Listed by Category
- C# Compiler Options Listed Alphabetically
- @ (C# Compiler Options)
- /addmodule (C# Compiler Options)
- /appconfig (C# Compiler Options)
- /baseaddress (C# Compiler Options)
- /bugreport (C# Compiler Options)
- /checked (C# Compiler Options)
- /codepage (C# Compiler Options)
- /debug (C# Compiler Options)
- /define (C# Compiler Options)
- /delaysign (C# Compiler Options)
- /doc (C# Compiler Options)
- /errorreport (C# Compiler Options)
- /filealign (C# Compiler Options)
- /fullpaths (C# Compiler Options)
- /help, /? (C# Compiler Options)
- /highentropyva (C# Compiler Options)
- /keycontainer (C# Compiler Options)
- /keyfile (C# Compiler Options)
- /langversion (C# Compiler Options)
- /lib (C# Compiler Options)
- /link (C# Compiler Options)
- /linkresource (C# Compiler Options)
- /main (C# Compiler Options)
- /moduleassemblyname (C# Compiler Option)
- /noconfig (C# Compiler Options)
- /nologo (C# Compiler Options)
- /nostdlib (C# Compiler Options)
- /nowarn (C# Compiler Options)
- /nowin32manifest (C# Compiler Options)
- /optimize (C# Compiler Options)
- /out (C# Compiler Options)
- /pdb (C# Compiler Options)
- /platform (C# Compiler Options)
- /preferreduilang (C# Compiler Options)
- /recurse (C# Compiler Options)
- /reference (C# Compiler Options)
- /resource (C# Compiler Options)
- /subsystemversion (C# Compiler Options)
- /target (C# Compiler Options)
- /target:appcontainerexe(C# 编译器选项)
- /target:exe (C# Compiler Options)
- /target:library (C# Compiler Options)
- /target:module (C# Compiler Options)
- /target:winexe (C# Compiler Options)
- /target:winmdobj(C# 编译器选项)
- /unsafe (C# Compiler Options)
- /utf8output (C# Compiler Options)
- /warn (C# Compiler Options)
- /warnaserror (C# Compiler Options)
- /win32icon (C# Compiler Options)
- /win32manifest (C# Compiler Options)
- /win32res (C# Compiler Options)
- C# Compiler Errors
- Compiler Error CS0001
- Compiler Error CS0006
- Compiler Error CS0007
- 编译器错误 CS0015
- Compiler Error CS0016
- Compiler Error CS0019
- Compiler Error CS0029
- Compiler Error CS0034
- Compiler Error CS0038
- Compiler Error CS0039
- Compiler Error CS0050
- Compiler Error CS0051
- Compiler Error CS0052
- Compiler Error CS0071
- Compiler Error CS0103
- Compiler Error CS0106
- Compiler Error CS0115
- Compiler Error CS0116
- Compiler Error CS0120
- Compiler Error CS0122
- Compiler Error CS0134
- Compiler Error CS0151
- 编译器错误 CS0163
- Compiler Error CS0165
- Compiler Error CS0173
- Compiler Error CS0178
- Compiler Error CS0188
- Compiler Error CS0201
- Compiler Error CS0229
- Compiler Error CS0233
- Compiler Error CS0234
- Compiler Error CS0246
- Compiler Error CS0260
- Compiler Error CS0266
- Compiler Error CS0269
- Compiler Error CS0270
- Compiler Error CS0304
- Compiler Error CS0310
- Compiler Error CS0311
- Compiler Error CS0413
- Compiler Error CS0417
- Compiler Error CS0433
- Compiler Error CS0445
- Compiler Error CS0446
- Compiler Error CS0504
- 编译器错误 CS0507
- Compiler Error CS0518
- Compiler Error CS0523
- Compiler Error CS0545
- Compiler Error CS0552
- Compiler Error CS0563
- Compiler Error CS0570
- Compiler Error CS0571
- Compiler Error CS0579
- Compiler Error CS0592
- Compiler Error CS0616
- Compiler Error CS0650
- Compiler Error CS0686
- Compiler Error CS0702
- 编译器错误 CS0703
- Compiler Error CS0731
- Compiler Error CS0826
- Compiler Error CS0834
- Compiler Error CS0840
- 编译器错误 CS0843
- Compiler Error CS0845
- Compiler Error CS1001
- Compiler Error CS1009
- Compiler Error CS1018
- Compiler Error CS1019
- Compiler Error CS1026
- Compiler Error CS1029
- Compiler Error CS1061
- Compiler Error CS1112
- 编译器错误 CS1501
- Compiler Error CS1502
- Compiler Error CS1519
- Compiler Error CS1540
- Compiler Error CS1546
- Compiler Error CS1548
- Compiler Error CS1564
- Compiler Error CS1567
- Compiler Error CS1579
- Compiler Error CS1612
- Compiler Error CS1614
- Compiler Error CS1640
- Compiler Error CS1644
- Compiler Error CS1656
- Compiler Error CS1674
- Compiler Error CS1703
- Compiler Error CS1704
- Compiler Error CS1705
- Compiler Error CS1708
- Compiler Error CS1716
- 编译器错误 CS1721
- Compiler Error CS1726
- Compiler Error CS1729
- Compiler Error CS1919
- Compiler Error CS1921
- Compiler Error CS1926
- Compiler Error CS1933
- Compiler Error CS1936
- Compiler Error CS1941
- Compiler Error CS1942
- Compiler Error CS1943
- Compiler Error CS1946
- 编译器错误 CS2032
- Compiler Warning (level 1) CS0420
- Compiler Warning (level 1) CS0465
- Compiler Warning (level 1) CS1058
- Compiler Warning (level 1) CS1060
- Compiler Warning (level 1) CS1598
- Compiler Warning (level 1) CS1607
- Compiler Warning (level 1) CS1616
- Compiler Warning (level 1) CS1658
- Compiler Warning (level 1) CS1683
- Compiler Warning (level 1) CS1685
- Compiler Warning (level 1) CS1690
- Compiler Warning (level 1) CS1691
- Compiler Warning (level 1) CS1699
- Compiler Warning (level 1) CS1762
- Compiler Warning (level 1) CS1956
- Compiler Warning (level 1) CS3003
- Compiler Warning (level 1) CS3007
- Compiler Warning (level 1) CS3009
- 编译器警告(等级 1)CS4014
- Compiler Warning (level 2) CS0108
- 编译器警告(等级 2)CS0467
- Compiler Warning (level 2) CS0618
- Compiler Warning (level 2) CS1701
- Compiler Warning (level 3) CS0675
- Compiler Warning (level 3) CS1700
- Compiler Warning (level 4) CS0429
- Compiler Warning (level 4) CS1591
- Compiler Warning (level 4) CS1610
- C# 语言规范