C# 语言规范--1.10 委托(转)
委托适用于那种在某些其他语言中需用函数指针来解决的情况(场合)。但是,与函数指针不同,委托是面向对象和类型安全的。委托声明定义一个类,它是从 System.Delegate 类派生的类。委托实例封装了一个调用列表,该列表列出了一个或多个方法,每个方法称为一个可调用实体。对于实例方法,可调用实体由一个实例和该实例的方法组成。对于静态方法,可调用实体仅由一个方法组成。如果用一组合适的参数来调用一个委托实例,则该委托实例所封装的每个可调用实体都会被调用,并且用的都是上述的同一组参数。委托实例的一个有趣且有用的属性是:它
C# 语言规范--1.8 结构(转)
类与结构有很多相似之处:结构可以实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。例如,将 Point 定义为结构而不是类在运行时可以节省很多内存空间。下面的程序创建并初始化一个 100 点的数组。对于作为类实现的 Point,出现了 101 个实例对象,因为数组需要一个,它的 100 个元素每个都需要一个。class Point{ public int x, y; public Point(int x, in
C# 语言规范--1.9 接口(转)
一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。示例interface IExample{ string this[int index] { get; set; } event EventHandler E; void F(int value); string P { get; set; }}public delegate void EventHandler(object sender, EventArgs e);显示了一个包含索引器、事件 E、方法 F 和属性 P 的接口。接口可以使用多重继承。在下面的示例中,interface IControl{ void Paint();}interface ITextBox: IControl{ void SetText(string text);}interface IListB
C# 语言规范--1.7 类(转)
类声明定义新的引用类型。一个类可以从另一个类继承,并且可以实现多个接口。类成员可以包括:常数、字段、方法、属性、事件、索引器、运算符、实例构造函数、析构函数、静态构造函数和嵌套类型声明。每个成员都有关联的可访问性,它控制能够访问该成员的程序文本区域。有五种可能的可访问性形式。下表概述了这些形式。publicprotectedinternalprotected internalprivate示例using System;class MyClass{ public MyClass() { Console.WriteLine("Instance constructor"); } public MyClass(int value) { MyFiel
C# 语言规范--1.6 语句(转)
C# 中的大多数语句都是直接从 C 和 C++ 借用的,但有一些值得注意的添加和修改。下表列出了可用的语句类型,并提供了每种类型的示例。static void Main() { F(); G(); { H(); I(); } }goto 语句static void Main(string[] args) { if (args.Length == 0) goto done; Console.WriteLine(args.Length);done: Console.WriteLine("Done");}static void Main() { const float pi = 3.14f; const int r = 123; Console.WriteLine(pi * r * r);}static void Main() { int a; int b = 2, c = 3; a = 1; Console.WriteLine(a + b + c);}s
C# 语言规范--1.5 表达式(转)
C# 包含一元运算符、二元运算符和一个三元运算符。下表概述了这些运算符,并将它们按优先级以从高到低的顺序列出:第 7.5 节 x.y f(x) a[x] x++ x-- newtypeof checked unchecked第 7.6 节+ - ! ~ ++x --x (T)x第 7.7 节* / %第 7.7 节+ -第 7.8 节<< >>第 7.9 节< > <= >= is as第 7.9 节== !=第 7.10 节&第 7.10 节^第 7.10 节|第 7.11 节&&第 7.11 节||第 7.12 节?:第 7.13 节= *= /= %= += -= <<= >>= &= ^= |=当表达式包含多个运算符时,运算符的优先级控制各运算符的计算顺序
C# 语言规范--1.4 自动内存管理(转)
手动内存管理要求开发人员管理内存块的分配和回收。手动内存管理可能既耗时又麻烦。在 C# 中提供了自动内存管理,使开发人员从这个繁重的任务中解脱出来。在绝大多数情况下,自动内存管理可以提高代码质量和开发人员的工作效率,并且不会对表达能力或性能造成负面影响。示例using System;public class Stack{ private Node first = null; public bool Empty { get { return (first == null); } } public object Pop() { if (first == null) throw new Exception("Can't Pop from an empty S
C# 语言规范--1.3 变量和参数(转)
变量表示存储位置。每个变量都属于一种类型,它确定什么样的值可以存储在该变量中。局部变量是在方法、属性或索引器中声明的变量。局部变量是通过指定类型名称和声明符(它指定变量名和可选的初始值)定义的,如:int a;int b = 1;但局部变量声明也可以包含多个声明符。a 和 b 的声明可以重写为:int a, b = 1;一个变量必须先赋值,然后才能使用它的值。示例class Test{ static void Main() { int a; int b = 1; int c = a + b; // error, a not yet assigned ... }}导致编译时错误,因为它试图在给变量 a 赋值
C# 语言规范--1.2 类型(转)
C# 支持两种类型:“值类型”和“引用类型”。值类型包括简单类型(如 char、int 和 float)、枚举类型和结构类型。引用类型包括类 (Class) 类型、接口类型、委托类型和数组类型。值类型与引用类型的区别在于值类型的变量直接包含其数据,而引用类型的变量则存储对象引用。对于引用类型,两个变量可能引用同一对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。示例using System;class Class1{ public int Value = 0;}class Test{ static v
C# 程序员参考--索引器教程(转)
本教程展示 C# 类如何声明索引器以提供对类的类似数组的访问。示例文件请参见“索引器”示例以下载和生成本教程中讨论的示例文件。教程定义“索引器”使您可以创建作为“虚拟数组”的类。该类的实例可以使用 [] 数组访问运算符进行访问。在 C# 中定义索引器类似于在 C++ 中定义运算符 [],但前者灵活得多。对于封装类似数组的功能或类似集合的功能的类,使用索引器使该类的用户可以使用数组语法访问该类。例如,假定您想定义一个类,该类使文件显示为字节数组。如果文件非常大,则将整个文件读入内存是不切实际的,尤其在您只想读取或更改
C# 程序员参考--用户定义的转换教程(转)
本教程展示如何定义转换以及如何在类或结构之间使用转换。示例文件请参见“用户定义的转换”示例以下载和生成本教程中讨论的示例文件。教程C# 允许程序员在类或结构上声明转换,以便可以使类或结构与其他类或结构或者基本类型相互进行转换。转换的定义方法类似于运算符,并根据它们所转换到的类型命名。在 C# 中,可以将转换声明为 implicit(需要时自动转换)或 explicit(需要调用转换)。所有转换都必须为 static,并且必须采用在其上定义转换的类型,或返回该类型。本教程介绍两个示例。第一个示例展示如何声明和使用转换,第二个示例
C# 程序员参考--库教程(转)
本教程展示如何在 C# 中创建和使用库。教程本教程演示如何使用必要的编译器选项创建托管 DLL 文件,以及如何通过客户程序使用该库。示例本示例使用下列模块: DLL 库 (Functions.dll),从以下源文件生成: Factorial.cs:计算并返回某数的阶乘。 DigitCounter.cs:计算所传递的字符串中的数字位数。使用该 DLL 的客户程序 (FunctionTest.exe),从源文件 FunctionClient.cs 进行编译。本程序显示输入参数的阶乘。生成库若要生成该库,请将 Functions 作为当前目录,并在命令提示处键入下列内容:csc /target:library /out:Functions.dll Fa
C# 程序员参考--数组教程二(转)
示例 下面是一个完整的 C# 程序,它声明并实例化上面所讨论的数组。 // arrays.cs using System; class DeclareArraysSample { public static void Main() { // Single-dimensional array int[] numbers = new int[5]; // Multidimensional array string[,] names = new string[5,4]; // Array-of-arrays (jagged array) byte[][] scores = new byte[5][];
C# 程序员参考--数组教程三(转)
多维数组 int[,] numbers = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} }; string[,] siblings = new string[2, 2] { {"Mike","Amy"}, {"Mary","Albert"} }; 可省略数组的大小,如下所示: int[,] numbers = new int[,] { {1, 2}, {3, 4}, {5, 6} }; string[,] siblings = new string[,] { {"Mike","Amy"}, {"Mary","Albert"} }; 如果提供了初始值设定项,则还可以省略 new 运算符,如下所示:
C# 程序员参考--命令行参数教程(转)
本教程展示如何访问命令行以及访问命令行参数数组的两种方法。 教程 下面的示例展示使用传递给应用程序的命令行参数的两种不同方法。示例 1 本示例演示如何输出命令行参数。 // cmdline1.cs // arguments: A B C using System; public class CommandLine { public static void Main(string[] args) { // The Length property is used to obtain the length of the array. // Notice that Length is a read-only prop
C# 程序员参考--数组教程(转)
本教程描述数组并展示它们在 C# 中的工作方式。 教程 本教程分为下述几节: 1.数组概述 2.声明数组 3.初始化数组 4.访问数组成员 5.数组是对象 6.对数组使用 foreach数组概述 C# 数组从零开始建立索引,即数组索引从零开始。C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。 声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。在 C# 中,将方括号放在标识符后是不合法的语法。 int[] table; // not in
C# 程序员参考--OLE DB 教程(转)
OLE DB 是用于访问数据的基于 COM 的应用程序编程接口 (API)。OLE DB 支持访问以 OLE DB 提供程序可以使用的任何格式(数据库、电子表格、文本文件等)存储的数据。每个 OLE DB 提供程序从某一特定类型的数据源(例如 SQL Server 数据库、Microsoft Access 数据库或 Microsoft Excel 电子表格)公开数据。本教程说明如何从 C# 应用程序中使用 Microsoft Access 数据库。教程本教程说明如何从 C# 中使用 Microsoft Access 数据库。它显示如何创建数据集并从数据库向该数据集添加表。本示例程序中使用的 BugTypes.mdb 数据库是 Microsoft Ac
C# 程序员参考--不安全代码教程(转)
该教程说明如何在 C# 中使用不安全代码(使用指针的代码)。教程在 C# 中很少需要使用指针,但仍有一些需要使用的情况。例如,在下列情况中使用允许采用指针的不安全上下文是正确的: 处理磁盘上的现有结构 涉及内部包含指针的结构的高级 COM 或平台调用方案 性能关键代码不鼓励在其他情况下使用不安全上下文。具体地说,不应该使用不安全上下文尝试在 C# 中编写 C 代码。警告 使用不安全上下文编写的代码无法被验证为安全的,因此只有在代码完全受信任时才会执行该代码。换句话说,不可以在不受信任的环境中执行不安全代码。例如,不能
C# 程序员参考--线程处理教程(转)
线程处理的优点是可以创建使用多个执行线程的应用程序。例如,某一进程可以具有管理与用户交互的用户界面线程,以及在用户界面线程等待用户输入时执行其他任务的辅助线程。该教程说明各种线程活动: 创建和执行线程 线程同步 线程间交互 使用线程池 使用 mutex 对象保护共享资源教程该教程包含下列示例: 示例 1:创建线程、启动线程和线程间交互 示例 2:同步两个线程:制造者和使用者 示例 3:使用线程池 示例 4:使用 Mutex 对象示例 1:创建线程、启动线程和线程间交互本示例说明如何创建和启动线程,并显示了同时在同一进程内运行的两
C# 程序员参考--安全性教程(转)
本教程讨论了 .NET Framework 安全性并显示了在 C# 修改安全权限的两种方式:命令性安全和声明性安全。教程大多数应用程序和组件开发人员不需完成任何特别的工作就可使用 .NET Framework 安全系统并从它所提供的安全保护中受益。但“安全库”是一个例外,它要求了解更多深入的知识并对安全系统加以特殊考虑。这些代码表明了安全托管代码与非限制代码之间的界限,后者如本机代码(这超出了 .NET Framework 安全基础结构可以强制的范围)。这些库通常必须受到高度信任才可以工作,它们是托管代码中编程错误会潜在地暴露安全隐患的一个位置。