C#基础教程

上传人:gbs****77 文档编号:10672728 上传时间:2020-04-13 格式:DOCX 页数:275 大小:376.69KB
返回 下载 相关 举报
C#基础教程_第1页
第1页 / 共275页
C#基础教程_第2页
第2页 / 共275页
C#基础教程_第3页
第3页 / 共275页
点击查看更多>>
资源描述
C 基础教程 适合初学者 C 基础教程 第一章 C 语言基础 本章介绍 C 语言的基础知识 希望具有 C 语言的读者能够基本掌握 C 语言 并以此为基础 能够进一步学习用 C 语言编写 window 应用程序和 Web 应用程序 当然仅靠一章的内容就完全掌握 C 语言是不可能的 如需进一步学习 C 语言 还需要认真阅读有关 C 语言的专著 1 1 C 语言特点 Microsoft NET 以下简称 NET 框架是微软提出的新一代 Web 软件开发模型 C 语言是 NET 框架中新一代的开发工 具 C 语言是一种现代 面向对象的语言 它简化了 C 语言在类 命名空间 方法重载和异常处理等方面的操作 它摒弃了 C 的复杂性 更易使用 更少出错 它使用组件编程 和 VB 一样容易使用 C 语法和 C 和 JAVA 语 法非常相似 如果读者用过 C 和 JAVA 学习 C 语言应是比较轻松的 用 C 语言编写的源程序 必须用 C 语言编译器将 C 源程序编译为中间语言 MicroSoft Intermediate Language MSIL 代码 形成扩展名为 exe 或 dll 文件 中间语言代码不是 CPU 可执行的机器码 在程序运行时 必 须由通用语言运行环境 Common Language Runtime CLR 中的既时编译器 JUST IN Time JIT 将中间语言代 码翻译为 CPU 可执行的机器码 由 CPU 执行 CLR 为 C 语言中间语言代码运行提供了一种运行时环境 C 语言的 CLR 和 JAVA 语言的虚拟机类似 这种执行方法使运行速度变慢 但带来其它一些好处 主要有 通用语言规范 Common Language Specification CLS NET 系统包括如下语言 C C VB J 他们 都遵守通用语言规范 任何遵守通用语言规范的语言源程序 都可编译为相同的中间语言代码 由 CLR 负责执行 只 要为其它操作系统编制相应的 CLR 中间语言代码也可在其它系统中运行 自动内存管理 CLR 内建垃圾收集器 当变量实例的生命周期结束时 垃圾收集器负责收回不被使用的实例占用的内 存空间 不必象 C 和 C 语言 用语句在堆中建立的实例 必须用语句释放实例占用的内存空间 也就是说 CLR 具 有自动内存管理功能 交叉语言处理 由于任何遵守通用语言规范的语言源程序 都可编译为相同的中间语言代码 不同语言设计的组件 可以互相通用 可以从其它语言定义的类派生出本语言的新类 由于中间语言代码由 CLR 负责执行 因此异常处理方 法是一致的 这在调试一种语言调用另一种语言的子程序时 显得特别方便 增加安全 C 语言不支持指针 一切对内存的访问都必须通过对象的引用变量来实现 只允许访问内存中允许访问 的部分 这就防止病毒程序使用非法指针访问私有成员 也避免指针的误操作产生的错误 CLR 执行中间语言代码前 要对中间语言代码的安全性 完整性进行验证 防止病毒对中间语言代码的修改 版本支持 系统中的组件或动态联接库可能要升级 由于这些组件或动态联接库都要在注册表中注册 由此可能带来 一系列问题 例如 安装新程序时自动安装新组件替换旧组件 有可能使某些必须使用旧组件才可以运行的程序 使用 新组件运行不了 在 NET 中这些组件或动态联接库不必在注册表中注册 每个程序都可以使用自带的组件或动态联接 库 只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹 bin 中 运行程序就自动使用在 bin 文件夹中的 组件或动态联接库 由于不需要在注册表中注册 软件的安装也变得容易了 一般将运行程序及库文件拷贝到指定文件 夹中就可以了 完全面向对象 不象 C 语言 即支持面向过程程序设计 又支持面向对象程序设计 C 语言是完全面向对象的 在 C 中不再存在全局函数 全局变量 所有的函数 变量和常量都必须定义在类中 避免了命名冲突 C 语言不支持 多重继承 1 2 编写控制台应用程序 使用 SDK 命令行工具编写控制台程序 第一个程序总是非常简单的 程序首先让用户通过键盘输入自己的名字 然后程序在屏幕上打印一条欢迎信息 程序的 代码是这样的 using System 导入命名空间 为 C 语言新增解释方法 解释到本行结束 class Welcome 类定义 类的概念见下一节 解释开始 和 C 语言解释用法相同 解释结束 static void Main 主程序 程序入口函数 必须在一个类中定义 Console WriteLine 请键入你的姓名 控制台输出字符串 Console ReadLine 从键盘读入数据 输入回车结束 Console WriteLine 欢迎 可以用任意一种文本编辑软件完成上述代码的编写 然后把文件存盘 假设文件名叫做 welcome cs C 源文件是以 cs 作为文件的扩展名 和 C 语言相同 C 语言是区分大小写的 高级语言总是依赖于许多在程序外部预定义的变量和 函数 在 C 或 C 中这些定义一般放到头文件中 用 include 语句来导入这个头文件 而在 C 语言中使用 using 语句导入名字空间 using System 语句意义是导入 System 名字空间 C 中的 using 语句的用途与 C 中 include 语句的用途基本类似 用于导入预定义的变量和函数 这样在自己的程序中就可以自由地使用这些变量和函 数 如果没有导入名字空间的话我们该怎么办呢 程序还能保持正确吗 答案是肯定的 那样的话我们就必须把代码改 写成下面的样子 class Welcome static void Main System Console WriteLine 请键入你的姓名 System Console ReadLine System Console WriteLine 欢迎 也就是在每个 Console 前加上一个前缀 System 这个小原点表示 Console 是作为 System 的成员而存在的 C 中 抛弃了 C 和 C 中繁杂且极易出错的操作符象 和 等 C 中的复合名字一律通过 来连接 System 是 Net 平台框 架提供的最基本的名字空间之一 有关名字空间的详细使用方法将在以后详细介绍 这里只要学会怎样导入名字空间就 足够了 程序的第二行 class Welcome 声明了一个类 类的名字叫做 Welcome C 程序中每个变量或函数都必须属于一个类 包括主函数 Main 不能象 C 或 C 那样建立全局变量 C 语言程序总是从 Main 方法开始执行 一个程序中不允 许出现两个或两个以上的 Main 方法 请牢记 C 中 Main 方法必须被包含在一个类中 Main 第一个字母必须大写 必须是一个静态方法 也就是 Main 方法必须使用 static 修饰 static void Main 是类 Welcome 中定义的主函数 静态方法意义见以后章节 程序所完成的输入输出功能是通过 Console 类来完成的 Console 是在名字空间 System 中已经定义好的一个类 Console 类有两个最基本的方法 WriteLine 和 ReadLine ReadLine 表示从输入设备输入数据 WriteLine 则用于在 输出设备上输出数据 如果在电脑上安装了 Visual Studio Net 则可以在集成开发环境中直接选择快捷键或菜单命令编译并执行源文件 如 果您不具备这个条件 那么至少需要安装 Microsoft Net Framework SDK 这样才能够运行 C 语言程序 Microsoft Net Framework SDK 中内置了 C 的编译器 csc exe 下面让我们使用这个微软提供的命令行编译器对程 序 welcome cs 进行编译 假设已经将 welcome cs 文件保存在 d Charp 目录下 启动命令行提示符 在屏幕上输 入一行命令 d 回车 cd Charp 回车 键入命令 C WINNT Microsoft NET Framework v1 0 3705 csc welcome cs 如果一切正常 welcome cs 文件将被编译 编译后生成可执行文件 Welcome exe 可以在命令提示符窗口运行可执行 文件 Welcome exe 屏幕上出现一行字符提示您输入姓名 请键入你的姓名 输入任意字符并按下回车键 屏幕将打 印出欢迎信息 欢迎 注意 和我们使用过的绝大多数编译器不同 在 C 中编译器只执行编译这个过程 而在 C 和 C 中要经过编译和链 接两个阶段 换而言之 C 源文件并不被编译为目标文件 obj 而是直接生成可执行文件 exe 或动态链接库 dll C 编 译器中不需要包含链接器 使用 Visual Studio Net 建立控制台程序 1 运行 Visual Studio Net 程序 出现如图 1 2 2A 界面 2 单击新建项目按钮 出现如图 1 2 2B 对话框 在项目类型 P 编辑框中选择 Visual C 项目 在模板 T 编辑框 中选择控制台应用程序 在名称 N 编辑框中键入 e1 在位置 L 编辑框中键入 D csarp 必须预先创建文件夹 D csarp 也可以单击浏览按钮 在打开文件对话框中选择文件夹 单击确定按钮 创建项目 出现如图 1 2 2C 界面 编写一个应用程序 可能包含多个文件 才能生成可执行文件 所有这些文件的集合叫做一个项目 3 修改 class1 cs 文件如下 有阴影部分是新增加的语句 其余是集成环境自动生成的 using System namespace e1 Class1 的摘要说明 class Class1 应用程序的主入口点 STAThread static void Main string args TODO 在此处添加代码以启动应用程序 Console WriteLine 请键入你的姓名 Console ReadLine Console WriteLine 欢迎 4 按 CTRL F5 键 运行程序 如右图 和 1 2 1 节运行效果相同 屏幕上出现一行字符 提示您输入姓名 请键入 你的姓名 输入任意字符并按下回车键 屏幕将打印出欢迎信息 欢迎 输入回车退出程序 图 1 2 2A 图 1 2 2B 1 3 类的基本概念 C 语言是一种现代 面向对象的语言 面向对象程序设计方法提出了一个全新的概念 类 它的主要思想是将数据 数据成员 及处理这些数据的相应方法 函数成员 封装到类中 类的实例则称为对象 这就是我们常说的封装性 类的基本概念 类可以认为是对结构的扩充 它和 C 中的结构最大的不同是 类中不但可以包括数据 还包括处理这些数据的函数 类 是对数据和处理数据的方法 函数 的封装 类是对某一类具有相同特性和行为的事物的描述 例如 定义一个描述个 人情况的类 Person 如下 using System class Person 类的定义 class 是保留字 表示定义一个类 Person 是类名 private string name 张三 类的数据成员声明 private int age 12 private 表示私有数据成员 public void Display 类的方法 函数 声明 显示姓名和年龄 Console WriteLine 姓名 0 年龄 1 name age public void SetName string PersonName 修改姓名的方法 函数 name PersonName public void SetAge int PersonAge age PersonAge Console WriteLine 姓名 0 年龄 1 name age 的意义是将第二个参数变量 name 变为字符串填到 0 位置 将第三个参数变量 age 变为字符串填到 1 位置 将第一个参数表示的字符串在显示器上输出 大家注意 这里我们实际定义了一个新的数据类型 为用户自己定义的数据类型 是对个人的特性和行为的描述 他的 类型名为 Person 和 int char 等一样为一种数据类型 用定义新数据类型 Person 类的方法把数据和处理数据的函 数封装起来 类的声明格式如下 属性 类修饰符 class 类名 类体 其中 关键字 class 类名和类体是必须的 其它项是可选项 类修饰符包括 new public protected internal private abstract 和 sealed 这些类修饰符以后介绍 类体用于定义类的成 员 1 3 2 类成员的存取控制 一般希望类中一些数据不被随意修改 只能按指定方法修改 既隐蔽一些数据 同样一些函数也不希望被其它类程序调 用 只能在类内部使用 如何解决这个问题呢 可用访问权限控制字 常用的访问权限控制字如下 private 私有 public 公有 在数据成员或函数成员前增加访问权限控制字 可以指定该数据成员或函数成员的访问权限 私有数据成员只能被类内部的函数使用和修改 私有函数成员只能被类内部的其它函数调用 类的公有函数成员可以被 类的外部程序调用 类的公有数据成员可以被类的外部程序直接使用修改 公有函数实际是一个类和外部通讯的接口 外部函数通过调用公有函数 按照预先设定好的方法修改类的私有成员 对于上述例子 name 和 age 是私有数据成 员 只能通过公有函数 SetName 和 SetAge 修改 既它们只能按指定方法修改 这里再一次解释一下封装 它有两个意义 第一是把数据和处理数据的方法同时定义在类中 第二是用访问权限控制字 使数据隐蔽 1 3 3 类的对象 Person 类仅是一个用户新定义的数据类型 由它可以生成 Person 类的实例 C 语言叫对象 用如下方法声明类的对 象 Person OnePerson new Person 此语句的意义是建立 Person 类对象 返回对象地址赋值给 Person 类变 量 OnePerson 也可以分两步创建 Person 类的对象 Person OnePerson OnePerson new Person OnePerson 虽然存储的是 Person 类对象地址 但不是 C 中的指针 不能象指针那样可以进行加减运算 也不能转换 为其它类型地址 它是引用型变量 只能引用 代表 Person 对象 具体意义参见以后章节 和 C C 不同 C 只 能用此种方法生成类对象 在程序中 可以用 OnePerson 方法名或 OnePerson 数据成员名访问对象的成员 例如 OnePerson Display 公 用数据成员也可以这样访问 注意 C 语言中不包括 C 语言中的 符号 1 3 4 类的构造函数和析构函数 在建立类的对象时 需做一些初始化工作 例如对数据成员初始化 这些可以用构造函数来完成 每当用 new 生成类 的对象时 自动调用类的构造函数 终于明白了 1 因此 可以把初始化的工作放到构造函数中完成 构造函数和类名 相同 没有返回值 例如可以定义 Person 类的构造函数如下 public Person string Name int Age 类的构造函数 函数名和类同名 无返回值 name Name age Age 当用 Person OnePerson new Person 张五 20 语句生成 Person 类对象时 将自动调用以上构造函数 请注意 如何把参数传递给构造函数 变量和类的对象都有生命周期 生命周期结束 这些变量和对象就要被撤销 类的对象被撤销时 将自动调用析构函数 一些善后工作可放在析构函数中完成 析构函数的名字为 类名 无返回类型 也无参数 Person 类的析构函数为 Person C 中类析构函数不能显示地被调用 它是被垃圾收集器撤销不被使用的对象时自动调用的 1 3 5 类的构造函数的重载 在 C 语言中 同一个类中的函数 如果函数名相同 而参数类型或个数不同 认为是不同的函数 这叫函数重载 仅 返回值不同 不能看作不同的函数 这样 可以在类定义中 定义多个构造函数 名字相同 参数类型或个数不同 根 据生成类的对象方法不同 调用不同的构造函数 例如可以定义 Person 类没有参数的构造函数如下 public Person 类的构造函数 函数名和类同名 无返回值 name 张三 age 12 用语句 Person OnePerson new Person 李四 30 生成对象时 将调用有参数的构造函数 而用语句 Person OnePerson new Person 生成对象时 调用无参数的构造函数 由于析构函数无参数 因此 析构函数不能重载 1 3 6 使用 Person 类的完整的例子 下边用一个完整的例子说明 Person 类的使用 VisualStudio Net 编译通过 using System namespace e1 定义以下代码所属命名空间 意义见以后章节 class Person private String name 张三 类的数据成员声明 private int age 12 public void Display 类的方法 函数 声明 显示姓名和年龄 Console WriteLine 姓名 0 年龄 1 name age public void SetName string PersonName 指定修改姓名的方法 函数 name PersonName public void SetAge int PersonAge 指定修改年龄的方法 函数 age PersonAge public Person string Name int Age 构造函数 函数名和类同名 无返回值 name Name age Age public Person 类的构造函数重载 name 田七 age 12 class Class1 static void Main string args Person OnePerson new Person 李四 30 生成类的对象 OnePerson Display 下句错误 在其它类 Class1 类 中 不能直接修改 Person 类中的私有成员 OnePerson name 王五 只能通过 Person 类中公有方法 SetName 修改 Person 类中的私有成员 name OnePerson SetName 王五 OnePerson SetAge 40 OnePerson Display OnePerson new Person OnePerson Display 键入 CTRL F5 运行后 显示的效果是 姓名 李四 年龄 30 姓名 王五 年龄 40 姓名 田七 年龄 12 1 4 C 的数据类型 从大的方面来分 C 语言的数据类型可以分为三种 值类型 引用类型 指针类型 指针类型仅用于非安全代码中 本节重点讨论值类型和引用类型 1 4 1 值类型和引用类型区别 在 C 语言中 值类型变量存储的是数据类型所代表的实际数据 值类型变量的值 或实例 存储在栈 Stack 中 赋值 语句是传递变量的值 引用类型 例如类就是引用类型 的实例 也叫对象 不存在栈中 而存储在可管理堆 Managed Heap 中 堆实际上是计算机系统中的空闲内存 引用类型变量的值存储在栈 Stack 中 但存储的不是引用类型对象 而是存储引用类型对象的引用 即地址 和指针所代表的地址不同 引用所代表的地址不能被修改 也不能转换为其它 类型地址 它是引用型变量 只能引用指定类对象 引用类型变量赋值语句是传递对象的地址 见下例 using System class MyClass 类为引用类型 public int a 0 class Test static void Main f1 static public void f1 int v1 1 值类型变量 v1 其值 1 存储在栈 Stack 中 int v2 v1 将 v1 的值 为 1 传递给 v2 v2 1 v1 值不变 v2 2 v2 2 v1 值不变 MyClass r1 new MyClass 引用变量 r1 存储 MyClass 类对象的地址 MyClass r2 r1 r1 和 r2 都代表是同一个 MyClass 类对象 r2 a 2 和语句 r1 a 2 等价 存储在栈中的变量 当其生命周期结束 自动被撤销 例如 v1 存储在栈中 v1 和函数 f1 同生命周期 退出函数 f1 v1 不存在了 但在堆中的对象不能自动被撤销 因此 C 和 C 语言 在堆中建立的对象 不使用时必须用语句释 放对象占用的存储空间 NET 系统 CLR 内建垃圾收集器 当对象的引用变量被撤销 表示对象的生命周期结束 垃圾 收集器负责收回不被使用的对象占用的存储空间 例如 上例中引用变量 r1 及 r2 是 MyClass 类对象的引用 存储在 栈中 退出函数 f1 r1 和 r2 都不存在了 在堆中的 MyClass 类对象也就被垃圾收集器撤销 也就是说 CLR 具有自 动内存管理功能 终于明白了 2 1 4 2 值类型变量分类 C 语言值类型可以分为以下几种 l 简单类型 Simple types 简单类型中包括 数值类型和布尔类型 bool 数值类型又细分为 整数类型 字符类型 char 浮点数类型和十进制 类型 decimal l 结构类型 Struct types l 枚举类型 Enumeration types C 语言值类型变量无论如何定义 总是值类型变量 不会变为引用类型变量 1 4 3 结构类型 结构类型和类一样 可以声明构造函数 数据成员 方法 属性等 结构和类的最根本的区别是结构是值类型 类是引 用类型 和类不同 结构不能从另外一个结构或者类派生 本身也不能被继承 因此不能定义抽象结构 结构成员也不 能被访问权限控制字 protected 修饰 也不能用 virtual 和 abstract 修饰结构方法 在结构中不能定义析构函数 虽 然结构不能从类和结构派生 可是结构能够继承接口 结构继承接口的方法和类继承接口的方法基本一致 下面例子定 义一个点结构 point using System struct point 结构定义 public int x y 结构中也可以声明构造函数和方法 变量不能赋初值 class Test static void Main point P1 P1 x 166 P1 y 111 point P2 P2 P1 值传递 使 P2 x 166 P2 y 111 point P3 new point 用 new 生成结构变量 P3 P3 仍为值类型变量 用 new 生成结构变量 P3 仅表示调用默认构造函数 使 x y 0 1 4 4 简单类型 简单类型也是结构类型 因此有构造函数 数据成员 方法 属性等 因此下列语句 int i int MaxValue string s i ToString 是正确的 即使一个常量 C 也会生成结构类型的实例 因此也可以使用结构类型的方法 例如 string s 13 ToString 是正确的 简单类型包括 整数类型 字符类型 布尔类型 浮点数类型 十进制类型 见 下表 保留字 System 命名空间中的名字 字节数 取值范围 sbyte System Sbyte 1 128 127 byte System Byte 1 0 255 short System Int16 2 32768 32767 ushort System UInt16 2 0 65535 int System Int32 4 2147483648 2147483647 uint System UInt32 4 0 4292967295 long System Int64 8 9223372036854775808 9223372036854775808 ulong System UInt64 8 0 18446744073709551615 char System Char 2 0 65535 float System Single 4 3 4E 38 3 4E 38 double System Double 8 1 7E 308 1 7E 308 bool System Boolean true false decimal System Decimal 16 正负 1 0 10 28 到 7 9 1028之间 C 简单类型使用方法和 C C 中相应的数据类型基本一致 需要注意的是 和 C 语言不同 无论在何种系统中 C 每种数据类型所占字节数是一定的 字符类型采用 Unicode 字符集 一个 Unicode 标准字符长度为 16 位 整数类型不能隐式被转换为字符类型 char 例如 char c1 10 是错误的 必须写成 char c1 char 10 char c A char c x0032 char c u0032 布尔类型有两个值 false true 不能认为整数 0 是 false 其它值是 true bool x 1 是错误的 不存在这种写法 只能写成 x true 或 x false 十进制类型 decimal 也是浮点数类型 只是精度比较高 一般用于财政金融计算 1 4 5 枚举类型 C 枚举类型使用方法和 C C 中的枚举类型基本一致 见下例 using System class Class1 enum Days Sat 1 Sun Mon Tue Wed Thu Fri 使用 Visual Studio Net enum 语句添加在 STAThread 前边 static void Main string args Days day Days Tue int x int Days Tue x 2 Console WriteLine day 0 x 1 day x 显示结果为 day Tue x 4 在此枚举类型 Days 中 每个元素的默认类型为 int 其中 Sun 0 Mon 1 Tue 2 依此类推 也可以直接给枚举 元素赋值 例如 enum Days Sat 1 Sun Mon Tue Wed Thu Fri Sat 终于明白了 3 在此枚举中 Sun 1 Mon 2 Tue 3 Wed 4 等等 和 C C 中不同 C 枚举元素类型可 以是 byte sbyte short ushort int uint long 和 ulong 类型 但不能是 char 类型 见下例 enum Days byte Sun Mon Tue Wed Thu Fri Sat 元素为字节类型 1 4 6 值类型的初值和默认构造函数 所有变量都要求必须有初值 如没有赋值 采用默认值 对于简单类型 sbyte byte short ushort int uint long 和 ulong 默认值为 0 char 类型默认值是 char 0 float 为 0 0f double 为 0 0d decimal 为 0 0m bool 为 false 枚举类型为 0 在结构类型和类中 数据成员的数值类型 变量设置为默认值 引用类型变量设置为 null 可以显示的赋值 例如 int i 0 而对于复杂结构类型 其中的每个数据成员都按此种方法赋值 显得过于麻烦 由于 数值类型都是结构类型 可用 new 语句调用其构造函数初始化数值类型变量 例如 int j new int 请注意 用 new 语句并不是把 int 变量变为引用变量 j 仍是值类型变量 这里 new 仅仅是调用其构造函数 所有的数值类型都有 默认的无参数的构造函数 其功能就是为该数值类型赋初值为默认值 对于自定义结构类型 由于已有默认的无参数的 构造函数 不能再定义无参数的构造函数 但可以定义有参数的构造函数 1 4 7 引用类型分类 C 语言中引用类型可以分为以下几种 类 C 语言中预定义了一些类 对象类 object 类 数组类 字符串类等 当然 程序员可以定义其它类 接口 代表 C 语言引用类型变量无论如何定义 总是引用类型变量 不会变为值类型变量 C 语言引用类型对象一般用运算符 new 建立 用引用类型变量引用该对象 本节仅介绍对象类型 object 类型 字符串类型 数组 其它类型在其它节 中介绍 1 4 8 对象类 object 类 C 中的所有类型 包括数值类型 都直接或间接地以 object 类为基类 对象类 object 类 是所有其它类的基类 任何一 个类定义 如果不指定基类 默认 object 为基类 继承和基类的概念见以后章节 C 语言规定 基类的引用变量可以 引用派生类的对象 注意 派生类的引用变量不可以引用基类的对象 因此 对一个 object 的变量可以赋予任何类型 的值 int x 25 object obj1 obj1 x object obj2 A object 关键字是在命名空间 System 中定义的 是类 System Object 的别名 1 4 9 数组类 在进行批量处理数据的时候 要用到数组 数组是一组类型相同的有序数据 数组按照数组名 数据元素的类型和维数 来进行描述 C 语言中数组是类 System Array 类对象 比如声明一个整型数数组 int arr new int 5 实际上 生成了一个数组类对象 arr 是这个对象的引用 地址 在 C 中数组可以是一维的也可以是多维的 同样也支持数组的数组 即数组的元素还是数组 一维数组最为普遍 用 的也最多 我们先看一个一维数组的例子 using System class Test static void Main int arr new int 3 用 new 运算符建立一个 3 个元素的一维数组 for int i 0 i arr Length i arr Length 是数组类变量 表示数组元素个数 arr i i i 数组元素赋初值 arr i 表示第 i 个元素的值 for int i 0 i arr Length i 数组第一个元素的下标为 0 Console WriteLine arr 0 1 i arr i 这个程序创建了一个 int 类型 3 个元素的一维数组 初始化后逐项输出 其中 arr Length 表示数组元素的个数 注意 数组定义不能写为 C 语言格式 int arr 程序的输出为 arr 0 0 arr 1 1 arr 2 4 上面的例子中使用的是一维数组 下面介绍多维数组 string a1 一维 string 数组类引用变量 a1 string a2 二维 string 数组类引用变量 a2 a2 new string 2 3 a2 1 2 abc string a3 三维 string 数组类引用变量 a3 string j2 数组的数组 即数组的元素还是数组 string j3 在数组声明的时候 可以对数组元素进行赋值 看下面的例子 int a1 new int 1 2 3 一维数组 有 3 个元素 int a2 new int 3 1 2 3 此格式也正确 int a3 1 2 3 相当于 int a3 new int 1 2 3 int a4 new int 1 2 3 4 5 6 二维数组 a4 1 1 5 int j2 new int 3 定义数组 j2 有三个元素 每个元素都是一个数组 j2 0 new int 1 2 3 定义第一个元素 是一个数组 j2 1 new int 1 2 3 4 5 6 每个元素的数组可以不等长 j2 2 new int 1 2 3 4 5 6 7 8 9 1 4 10 字符串类 string 类 C 还定义了一个基本的类 string 专门用于对字符串的操作 这个类也是在名字空间 System 中定义的 是类 System String 的别名 字符串应用非常广泛 在 string 类的定义中封装了许多方法 下面的一些语句展示了 string 类的一些典型用法 l 字符串定义 string s 定义一个字符串引用类型变量 s s Zhang 字符串引用类型变量 s 指向字符串 Zhang string FirstName Ming string LastName Zhang string Name FirstName LastName 运算符 已被重载 string SameName Name char s2 计 算 机 科 学 string s3 new String s2 l 字符串搜索 string s ABC 科学 int i s IndexOf 科 搜索 科 在字符串中的位置 因第一个字符索引为 0 所以 A 索引为 0 科 索引为 3 因此这里 i 3 如没有此字符 串 i 1 注意 C 中 ASCII 和汉字都用 2 字节表示 l 字符串比较函数 string s1 abc string s2 abc int n string Compare s1 s2 n 0 n 0 表示两个字符串相同 n 小于零 s1s2 此方法区分大小写 也可用如下办法比较字符串 string s1 abc string s abc string s2 不相同 if s s1 还可用 虽然 String 是引用类型 但这里比较两个字符串的值 s2 相同 l 判断是否为空字符串 string s string s1 不空 if s Length 0 s1 空 l 得到子字符串或字符 string s 取子字符串 string sb s Substring 2 2 从索引为 2 开始取 2 个字符 Sb 字符 s 内容不变 char sb1 s 0 sb1 取 Console WriteLine sb1 显示 取 l 字符串删除函数 string s 取子字符串 string sb s Remove 0 2 从索引为 0 开始删除 2 个字符 Sb 字符串 s 内容不变 l 插入字符串 string s 计算机科学 string s1 s Insert 3 软件 s1 计算机软件科学 s 内容不变 l 字符串替换函数 string s 计算机科学 string s1 s Replace 计算机 软件 s1 软件科学 s 内容不变 l 把 String 转换为字符数组 string S 计算机科学 char s2 S ToCharArray 0 S Length 属性 Length 为字符类对象的长度 l 其它数据类型转换为字符串 int i 9 string s8 i ToString s8 9 float n 1 9f string s9 n ToString s8 1 9 其它数据类型都可用此方法转换为字符类对象 l 大小写转换 string s AaBbCc string s1 s ToLower 把字符转换为小写 s 内容不变 string s2 s ToUpper 把字符转换为大写 s 内容不变 l 删除所有的空格 string s A bc s Trim 删除所有的空格 string 类其它方法的使用请用帮助系统查看 方法是打开 Visual Studio Net 的代码编辑器 键入 string 将光标移到 键入的字符串 string 上 然后按 F1 键 1 4 11 类型转换 在编写 C 语言程序中 经常会碰到类型转换问题 例如整型数和浮点数相加 C 会进行隐式转换 详细记住那些类型 数据可以转换为其它类型数据 是不可能的 也是不必要的 程序员应记住类型转换的一些基本原则 编译器在转换发 生问题时 会给出提示 C 语言中类型转换分为 隐式转换 显示转换 加框 boxing 和消框 unboxing 等三种 一 隐式转换 隐式转换就是系统默认的 不需要加以声明就可以进行的转换 例如从 int 类型转换到 long 类型就是一种隐式转换 在隐式转换过程中 转换一般不会失败 转换过程中也不会导致信息丢失 例如 int i 10 long l i 二 显示转换 显式类型转换 又叫强制类型转换 与隐式转换正好相反 显式转换需要明确地指定转换类型 显示转换可能导致信息 丢失 下面的例子把长整形变量显式转换为整型 long l 5000 int i int l 如果超过 int 取值范围 将产生异常 三 加框 boxing 和消框 unboxing 加框 boxing 和消框 unboxing 是 C 语言类型系统提出的核心概念 加框是值类型转换为 object 对象 类型 消框 是 object 对象 类型转换为值类型 有了加框和消框的概念 对任何类型的变量来说最终我们都可以看作是 object 类 型 1 加框操作 把一个值类型变量加框也就是创建一个 object 对象 并将这个值类型变量的值复制给这个 object 对象 例如 int i 10 object obj i 隐式加框操作 obj 为创建的 object 对象的引用 我们也可以用显式的方法来进行加框操作 例如 int i 10 object obj object i 显式加框操作 值类型的值加框后 值类型变量的值不变 仅将这个值类型变量的值复制给这个 object 对象 我们看一下下面的程序 using System class Test public static void Main int n 200 object o n o 201 不能改变 n Console WriteLine 0 1 n o 输出结果为 200 201 这就证明了值类型变量 n 和 object 类对象 o 都独立存在着 2 消框操作 和加框操作正好相反 消框操作是指将一个对象类型显式地转换成一个值类型 消框的过程分为两步 首先检查这个 object 对象 看它是否为给定的值类型的加框值 如是 把这个对象的值拷贝给值类型的变量 我们举个例子来看看 一个对象消框的过程 int i 10 object obj i int j int obj 消框操作 可以看出消框过程正好是加框过程的逆过程 必须注意加框操作和消框操作必须遵循类型兼容的原则 1 3 加框和消框的使用 定义如下函数 void Display Object o 注意 o 为 Object 类型 int x int o 消框 System Console WriteLine 0 1 x o 调用此函数 int y 20 Display y 在此利用了加框概念 虚参被实参替换 Object o y 也就是说 函数的参数是 Object 类型 可以将任意类型实参传递给函数 1 5 运算符 C 语言和 C 语言的运算符用法基本一致 以下重点讲解二者之间不一致部分 1 5 1 运算符分类 与 C 语言一样 如果按照运算符所作用的操作数个数来分 C 语言的运算符可以分为以下几种类型 l 一元运算符 一元运算符作用于一个操作数 例如 X X X 等 l 二元运算符 二元运算符对两个操作数进行运算 例如 x y l 三元运算符 三元运算符只有一个 x y z C 语言运算符的详细分类及操作符从高到低的优先级顺序见下表 类别 操作符 初级操作符 x x y f x a x x x new type of sizeof checked unchecked 一元操作符 x x T x 乘除操作符 加减操作符 移位操作符 关系操作符 is as 等式操作符 逻辑与操作符 class Test public static void Main Console WriteLine 1 is int Console WriteLine 1 is float Console WriteLine 1 0f is float Console WriteLine 1 0d is double 输出为 True False True True 1 5 3 typeof 运算符 typeof 操作符用于获得指定类型在 system 名字空间中定义的类型名字 例如 using System class Test static void Main Console WriteLine typeof int Console WriteLine typeof System Int32 Console WriteLine typeof string Console WriteLine typeof double 产生如下输出 由输出可知 int 和 System int32 是同一类型 System Int32 System Int32 System String System Double 1 5 4 溢出检查操作符 checked 和 unchecked 在进行整型算术运算 如 等 或从一种整型显式转换到另一种整型时 有可能出现运算结果超出这个结果所属 类型值域的情况 这种情况称之为溢出 整型算术运算表达式可以用 checked 或 unchecked 溢出检查操作符 决定 在编译和运行时是否对表达式溢出进行检查 如果表达式不使用溢出检查操作符或使用了 checked 操作符 常量表达 式溢出 在编译时将产生错误 表达式中包含变量 程序运行时执行该表达式产生溢出 将产生异常提示信息 而使用 了 unchecked 操作符的表达式语句 即使表达式产生溢出 编译和运行时都不会产生错误提示 但这往往会出现一些 不可预期的结果 所以使用 unchecked 操作符要小心 下面的例子说明了 checked 和 unchecked 操作符的用法 using System class Class1 static void Main string args const int x int MaxValue unchecked 不检查溢出 int z x 2 编译时不产生编译错误 z 2 Console WriteLine z 0 z 显示 2 checked 检查溢出 int z1 x 2 编译时会产生编译错误 Console WriteLine z 0 z1 1 5 5 new 运算符 new 操作符可以创建值类型变量 引用类型对象 同时自动调用构造函数 例如 int x new int 用 new 创建整型变量 x 调用默认构造函数 Person C1 new Person 用 new 建立的 Person 类对象 Person 变量 C1 对象的引用 int arr new int 2 数组也是类 创建数组类对象 arr 是数组对象的引用 需注意的是 int x new int 语句将自动调用 int 结构不带参数的构造函数 给 x 赋初值 0 x 仍是值类型变量 不会 变为引用类型变量 1 5 6 运算符的优先级 当一个表达式包含多种操作符时 操作符的优先级控制着操作符求值的顺序 例如 表达式 x y z 按照 x y z 顺序 求值 因为 操作符比 操作符有更高的优先级 这和数学运算中的先乘除后加减是一致的 1 5 1 节中的表总结了所 有操作符从高到低的优先级顺序 当两个有相同优先级的操作符对操作数进行运算时 例如 x y z 操作符按照出现的顺序由左至右执行 x y z 按 x y z 进行求值 赋值操作符按照右接合的原则 即操作按照从右向左的顺序执行 如 x y z 按照 x y z 进行 求值 建议在写表达式的时候 如果无法确定操作符的实际顺序 则尽量采用括号来保证运算的顺序 这样也使得程序 一目了然 而且自己在编程时能够思路清晰 1 6 程序控制语句 C 语言控制语句和 C 基本相同 使用方法基本一致 C 语言控制语句包括 if 语句 swith 语句 while 语句 do while 语句 for 语句 foreach 语句 break 语句 continue 语句 goto 语句 return 语句 异常处理语句等 其中 foreach 语句和异常语句是 C 语言新增加控制语句 本节首先介绍一下这些语句和 C 语言的不同点 然后介绍 C 语言新增的控制语句 1 6 1 和 C 语言的不同点 l 与 C 不同 if 语句 while 语句 do while 语句 for 语句中的判断语句 一定要用布尔表达式 不能认为 0 为 false 其它数为 true l switch 语句不再支持遍历 C 和 C 语言允许 switch 语句中 case 标签后不出现 break 语句 但 C 不允许这样 它 要求每个 case 标签项后使用 break 语句或 goto 跳转语句 即不允许从一个 case 自动遍历到其它 case 否则编译时 将报错 switch 语句的控制类型 即其中控制表达式的数据类型可以是 sbyte byte short ushort uint long ulong char string 或枚举类型 每个 case 标签中的常量表达式必 须属于或能隐式转换成控制类型 如果有两个或两个以上 case 标签中的常量表达式值相同 编译时将会报错 执行 switch 语句 首先计算 switch 表达式 然后与 case 后的常量表达式的值进行比较 执行第一个与之匹配的 case 分 支下的语句 如果没有 case 常量表达式的值与之匹配 则执行 dafault 分支下的语句 如果没有 dafault 语句 则退 出 switch 语句 switch 语句中可以没有 dafault 语句 但最多只能有一个 dafault 语句 见下例 using System class class1 static void Main System Console WriteLine 请输入要计算天数的月份 string s System Console ReadLine string s1 switch s case 1 case 3 case 5 case 7 case 8 case 10 case 12 共用一条语句 s1 31 break case 2 s1 28 break case 4 case 6 case 9 goto case 11 goto 语句仅为说明问题 无此必要 case 11 s1 30 break default s1 输入错误 break System Console WriteLine s1 1 6 2 foreach 语句 foreach 语句是 C 语言新引入的语句 C 和 C 中没有这个语句 它借用 Visual Basic 中的 foreach 语句 语句的 格式为 foreach 类型 变量名 in 表达式 循环语句 其中表达式必须是一个数组或其它集合类型 每一次循环从数组或其它集合中逐一取出数据 赋值给指定类型的变量 该变量可以在循环语句中使用 处理 但不允许修改变量 该变量的指定类型必须和表达式所代表的数组或其它集合中 的数据类型一致 例子 using System class Test public static void Main int list 10 20 30 40 数组 foreach int m in list Console WriteLine 0 m 对于一维数组 foreach 语句循环顺序是从下标为 0 的元素开始一直到数组的最后一个元素 对于多维数组 元素下标 的递增是从最右边那一维开始的 同样 break 和 continue 可以出现在 foreach 语句中 功能不变 1 6 3 异常语句 在编写程序时 不仅要关心程序的正常操作 还应该考虑到程序运行时可能发生的各类不可预期的事件 比如用户输入 错误 内存不够 磁盘出错 网络资源不可用 数据库无法使用等 所有这些错误被称作异常 不能因为这些异常使程 序运行产生问题 各种程序设计语言经常采用异常处理语句来解决这类异常问题 C 提供了一种处理系统级错误和应用程序级错误的结
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!