概述
· Main 方法是程序的入口点,程序控制在该方法中开始和结束。
· 该方法在类或结构的内部声明。它必须为静态方法,而不应为公共方法。(在上面的示例中,它接受默认访问级别 private。
· 它可以具有 void 或 int 返回类型。
· 声明 Main 方法时既可以使用参数,也可以不使用参数。
· 参数可以作为从零开始索引的命令行参数来读取。
· 与 C 和 C++ 不同,程序的名称不会被当作第一个命令行参数。
数据类型概述
数据类型可描述为:
· 内置数据类型,如 int 或 char,
· 用户定义数据类型,如 class 或 interface。
· 数据类型还可以定义为:
· 值类型(C# 2005 参考)(用于存储值),
· 引用类型(C# 2005 参考)(用于存储对实际数据的引用)。
数组概述
数组具有以下属性:
· 数组可以是一维、多维或交错的。
· 数值数组元素的默认值设置为零,而引用元素的默认值设置为 null。
· 交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null。
· 数组的索引从零开始:具有 n 个元素的数组的索引是从 0 到 n-1。
· 数组元素可以是任何类型,包括数组类型。
· 数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable 和 IEnumerable,因此可以对 C# 2005 中的所有数组使用 foreach 迭代。
概述
对象、类和结构具有以下特点:
· 对象是给定数据类型的实例。在执行应用程序时,数据类型为创建(或实例化)的对象提供蓝图。
· 新数据类型是使用类和结构定义的。
· 类和结构(包含代码和数据)组成了 C# 2005 应用程序的生成块。C# 2005 应用程序始终包含至少一个类。
· 结构可视为轻量类,是创建用于存储少量数据的数据类型的理想选择,不能表示以后可能要通过继承进行扩展的类型。
· C# 2005 类支持继承,这意味着它们可以从先前定义的类中派生。
属性概述
· 属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。
· get 属性访问器用于返回属性值,而 set 访问器用于分配新值。这些访问器可以有不同的访问级别。有关更多信息,请参见访问器可访问性。
· value 关键字用于定义由 set 索引器分配的值。
· 不实现 set 方法的属性是只读的。
索引器概述
· 索引器使得对象可按照与数组相似的方法进行索引。
· get 访问器返回值。set 访问器分配值。
· this 关键字用于定义索引器。
· value 关键字用于定义由 set 索引器分配的值。
· 索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
· 索引器可被重载。
· 索引器可以有多个形参,例如当访问二维数组时。
事件概述
事件具有以下特点:
· 事件是类用来通知对象需要执行某种操作的方式。
· 尽管事件在其他时候(如信号状态更改)也很有用,事件通常还是用在图形用户界面中。
· 事件通常使用委托事件处理程序进行声明。
· 事件可以调用匿名方法来替代委托。有关更多信息,请参见匿名方法。
迭代器概述
· 迭代器是可以返回相同类型的值的有序序列的一段代码。
· 迭代器可用作方法、运算符或 get 访问器的代码体。
· 迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。有关更多信息,请参见 yield。
· 可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}
· 迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable 或 IEnumerator。
yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。
迭代器对集合类特别有用,它提供一种简单的方法来迭代不常用的数据结构(如二进制树)。
命名空间概述
命名空间具有以下属性:
· 组织大型代码项目。
· 以 . 运算符分隔。
· using directive 意味着不需要为每个类指定命名空间的名称。
· global 命名空间是“根”命名空间:global::system 始终引用 .NET Framework 命名空间 System。
可空类型概述
可空类型具有以下特性:
· 可空类型表示可被赋值为 null 值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持 null 值。)。
· 语法 T? 是 System.Nullable<T> 的简写,此处的 T 为值类型。这两种形式可以互换。
· 为可空类型赋值与为一般值类型赋值的方法相同,如 int? x = 10; 或 double? d = 4.108;。
· 如果基础类型的值为 null,请使用 System.Nullable.GetValueOrDefault 属性返回该基础类型所赋的值或默认值,例如 int j = x.GetValueOrDefault();
· 请使用 HasValue 和 Value 只读属性测试是否为空和检索值,例如 if(x.HasValue) j = x.Value;
o 如果此变量包含值,则 HasValue 属性返回 True;或者,如果此变量的值为空,则返回 False。
o 如果已赋值,则 Value 属性返回该值,否则将引发 System.InvalidOperationException。
o 可空类型变量的默认值将 HasValue 设置为 false。未定义 Value。
· 使用 ?? 运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如 int? x = null; int y = x ?? -1;。
· 不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>> n;
不安全代码概述
不安全代码具有下列属性:
· 方法、类型和可被定义为不安全的代码块。
· 在某些情况下,通过移除数组界限检查,不安全代码可提高应用程序的性能。
· 当调用需要指针的本机函数时,需要使用不安全代码。
· 使用不安全代码将引起安全风险和稳定性风险。
· 在 C# 2005 中,为了编译不安全代码,必须用 /unsafe 编译应用程序。
应用程序域概述
应用程序域具有以下特点:
· 必须先将程序集加载到应用程序域中,然后才能执行该程序集。有关更多信息,请参见程序集和全局程序集缓存(C# 2005 编程指南)。
· 一个应用程序域中的错误不会影响在另一个应用程序域中运行的其他代码。
· 能够在不停止整个进程的情况下停止单个应用程序并卸载代码。不能卸载单独的程序集或类型,只能卸载整个应用程序域。
程序集概述
程序集具有以下特点:
· 程序集作为 .exe 或 .dll 文件实现。
· 通过将程序集放在全局程序集缓存中,可在多个应用程序之间共享程序集。
· 要将程序集放在全局程序集缓存中,必须对程序集进行强命名。有关更多信息,请参见具有强名称的程序集。
· 程序集仅在需要时才加载到内存中。
· 可以使用反射来以编程方式获取关于程序集的信息。有关更多信息,请参见主题反射。
· 如果加载程序集的目的只是对其进行检查,应使用诸如 ReflectionOnlyLoadFrom 的方法。
· 可以在单个应用程序中使用相同程序集的两个版本。有关更多信息,请参见 extern 别名。
属性概述
属性具有以下特点:
· 属性可向程序中添加元数据。元数据是嵌入程序中的信息,如编译器指令或数据描述。
· 程序可以使用反射检查自己的元数据。请参见使用反射访问属性。
· 通常使用属性与 COM 交互
集合类概述
集合类具有以下特点:
· 集合类定义为 System.Collections 或 System.Collections.Generic 命名空间的一部分。
· 大多数集合类都派生自 ICollection、IComparer、IEnumerable、IList、IDictionary 和 IDictionaryEnumerator 接口以及它们的等效泛型接口。
· 使用泛型集合类可以提供更高的类型安全性,在某些情况下还可以提供更好的性能,尤其是在存储值类型时,这些优势会体现得更明显。有关更多信息,请参见泛型的优点。
异常概述
异常具有以下特点:
· 在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常。
· 发生异常时,控制流立即跳转到关联的异常处理程序(如果存在)。
· 如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息。
· 可能导致异常的操作通过 try 关键字来执行。
· 异常处理程序是在异常发生时执行的代码块。在 C# 2005 中,catch 关键字用于定义异常处理程序。
· 程序可以使用 throw 关键字显式地引发异常。
· 异常对象包含有关错误的详细信息,其中包括调用堆栈的状态以及有关错误的文本说明。
· 即使引发了异常,finally 块中的代码也会执行,从而使程序可以释放资源。
线程概述
线程具有以下特点:
· 线程使 C# 2005 程序能够执行并发处理。
· .NET Framework 的 System.Threading 命名空间使线程更易于使用。
· 线程共享应用程序的资源。有关更多信息,请参见使用线程和线程处理。
反射概述
反射在下列情况下很有用:
· 需要访问程序元数据的属性。请参见主题使用反射访问属性。
· 检查和实例化程序集中的类型。
· 在运行时构建新类型。使用 System.Reflection.Emit 中的类。
· 执行后期绑定,访问在运行时创建的类型的方法。请参见主题动态加载和使用类型。