面向对象和组件的C编程科学出版社.ppt
《面向对象和组件的C编程科学出版社.ppt》由会员分享,可在线阅读,更多相关《面向对象和组件的C编程科学出版社.ppt(71页珍藏版)》请在三一文库上搜索。
1、面向对象和组件的C#编程 科学出版社,第二章 程序结构、变量、类型、运算符,李 军 武汉大学 测绘学院 “我成长”网站 ,第二章 程序结构、变量、类型、运算符,程序结构,变量、常量和字量,类型,运算符,运算符的优先级和结合性,2.1 程序结构,在1.7节,我们编写了一个Hello控制台程序,代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HelloApp class Program static void Main(string args)
2、 Console.WriteLine(“Hello!“); ,最简单的Hello控制台程序代码,上面就是最简单的Hello控制台程序代码吗? 其实代码还可简化成下面的形式: class Program static void Main() System.Console.WriteLine(“Hello!“); 它没有了前面四条using语句, 也没有了namespace,Main()中也没有参数; 但在Console前添加了“System.”。 它才是最简单的Hello控制台程序代码!,2.1.1 用类比理解程序结构,房屋好比是类class,房屋名称为HappyHouse; 房屋入口是类中的M
3、ain()函数。 房主拥有的那块土地称为myLand, 它由namesapce定义: namespace myLand class HappyHouse static void Main() System.Console.WriteLine(“Hello!“); ,类比,1) WriteLine可类比为其它土地(System)中房屋(Console)里面的某个东西,用代码表示为: 土地.房屋.东西; 2) 小数点“.”表示访问操作,例如myLand.HappyHouse.Main() 表示: 访问myLand中HappyHouse的Main成员。 HappyHouse房主并没有定义WriteL
4、ine, 但并不妨碍他借用别人的东西。 他在Main中就借用了基类库BCL的函数: System.Console.WriteLine();,2.1.2 命名空间,用C#的术语说,namespace关键字定义了命名空间, 大括号中的东西称为类型,语法如下: namespace 空间名称 定义类型 大括号界定了范围。空间名称要唯一,否则无法界定命名空间中的类型。 类型中定义的东西称为成员。如下所示: namespace 空间名称 类型1 成员 类型2 成员 . ,命名空间-一个分组符号,namespace 说明HelloApp是本项目的命名空间。 命名空间就是一个程序集内相关类型的一个分组符号。
5、System 内建数据、数学计算、垃圾收集器 System.Drawing 处理图形和绘图,包括打印 System.Data 处理数据存取和管理, ADO.NET System.IO 管理对文件和流的同步和异步访问System.Windows 处理基于窗体的窗口的创建System.Reflection 包含从程序集读取元数据的类System.Threading 包含用于多线程编程的类 System.Collections 包含定义各种对象集的接口和类,程序集、命名空间、类型和成员,一个程序集可以包含任意个命名空间, 每个命名空间又可以包含多种类型。 用“对象浏览器”可见: 程序集只有一个Hel
6、loApp命名空间, 命名空间中的类型是Program类(class),Object是Program的基类;右边是Object类的成员。,分析下面代码,namespace HelloApp /命名空间 int a; /定义变量:错误! static void Main() /定义函数:错误! class Program ,2.1.3 引用using,“引用”反映了C#编程的组件思想: 尽可能使用基类库或其它成熟的程序集。 using System; 说明了HelloApp项目引用(using)了System命名空间。 System命名空间中,提供了大量核心的类型, 如System.Int32、
7、string等类型,定义在内部程序集中 。 using简化了对特定命名空间中类型的引用方法。 因为引用了System,所以编译器能够将Console类解析为这个命名空间的成员。如果没有引用System,将出现一个编译器错误。也可以使用完全限定名来使用Console类的函数: System.Console.WriteLine(“Hello!“);,系统自动添加的引用-内部程序集,许多核心的.NET命名空间包含在mscorlib.dll文件中。多数.NET Framework程序集都位于全局程序集缓存GAC的特定目录下(默认下C:WindowsAssembly)。在创建本项目时,系统自动添加了一些
8、全局程序集的引用, 对它们的引用,仅仅通过using关键字来指定命名空间即可。,引用外部程序集(do it),不在上图中列出的程序集,都是外部程序集。 对外部程序集,除了通过using关键字来指定命名空间,还需要告诉C#编译器包含引用类型的程序集的名字。 例如,System.Drawing.Bitmap类型包含在另一个名为System.Drawing.dll的程序集中。引用它的方法如下: 右键点击【引用】【添加引用】, 然后在对话框中选择System.Drawing组件; 见下图。,添加System.Drawing.dll程序集,在Program.cs代码前添加:,using System.D
9、rawing; 你就可以在项目中添加图形类型的具体引用了, 例如在Main()中加上语句: Bitmap Map =new Bitmap(20, 20); Bitmap是System.Drawing命名空间中的一个类。 Map是Bitmap类型的变量, 通过Map =new Bitmap(20, 20); 语句被赋值为Bitmap对象;即调用Bitmap类的构造函数Bitmap(20, 20)来创建的一个对象。 也可说Map是用new实例化的一个Bitmap对象。 注:命名空间与程序集一般是对应的,命名空间为*, 它的程序集名字就为*.dll。,2.1.4 格式化输出,在Main()中添加语句
10、: Console.WriteLine(“0, 1“, “Hello“, “World!“ ); 系统输出: “Hello, World!”字符串。 0、1标记嵌入在字符串中, 它是格式化输出方法, 与C语言的printf()相似。 可以使用这种花括号在文本内部指定占位符。 在运行时,值会传入到WriteLine()来替代每一个占位符。,数据的位置索引,可以在字符串文本的任意位置放置占位符,而不需要按照递增的次序。例如代码: Console.WriteLine(“1+0+2=3“, 10, 20, 30, 60); / 数据的位置索引 0 1 2 3 / 输出:20+10+30=60 后面数据
11、 10,20,30,60 的位置索引总是依递增次序0,1,2,3;而占位符n中的n只能是03, 0表明在占位符0上接受的是索引为0的数据(即10), 1上接受的是索引为1的数据(即20); 而0排在1的后面,故10在20的后面显示。,格式化数值数据,如果数值数据需要更精细的格式化,每一个占位符都可以(可选)包含不同的格式字符,下表显示了核心格式化选项。,使用一些格式化标记(do it),给定的占位符值以冒号为标记,将这些字符作为后缀(例如,0:C、1:d、2:X)。 修改Main()方法,添加下面的语句,从而格式化一个固定值。例如: /使用一些格式化标记 Console.WriteLine(“
12、The value 88888 in various formats:“); Console.WriteLine(“c format: 0:c“, 88888); / 0代表占位符 Console.WriteLine(“d9 format: 0:d9“, 88888); / 补零到9位,前补零 Console.WriteLine(“f3 format: 0:f3“, 88888); / f3 保留小数点后3位 Console.WriteLine(“n format: 0:n“, 88888); / 注意,十六进制数的大小写形式决定了字母是大写还是小写。 Console.WriteLine(“E
13、 format: 0:E“, 88888); Console.WriteLine(“e format: 0:e“, 88888); Console.WriteLine(“X format: 0:X“, 88888); Console.WriteLine(“x format: 0:x“, 88888);,应用程序的输出 (do it),在控制台应用程序外格式化数值数据,.NET字符串格式化字符不局限于在控制台程序中使用!同样的格式化语法可以在调用静态的string.Format()方法时使用。 如果我们需要对任何应用程序类型(桌面GUI程序、 Web程序等)在运行时组合文本数据,这个方法就很有用
14、。在消息对话框中显示: / 使用string.Format()来格式化字符串文本 string userSt = string.Format(“100 in hex is 0:x“,100); / 需要引用System.Windows.Forms.dll才能编译这行代码 System.Windows.Forms.MessageBox.Show(userSt); 注意string.Format()是按照提供的标志进行格式化的。 至此,我们就可以任意使用需要的文本数据了。,2.2 变量、常量和字量,2.2.1 变量的声明 定义或声明变量的方法如下: 类型 var_name; 类型 var_name
15、 = 初值; 其中var_name是变量的名称(标识符)。 注:如果是在类中定义的变量, 声明时可加修饰符(细节见后面章节),2.2.3 变量的种类和赋值,2.2.2 变量的命名 (自学) 变量分为八种类别: 静态、非静态变量、数组元素、局部变量, 值参数、引用参数、输出参数、数组参数。 注意:在C#中,不能定义全局变量。 【例2-3】变量的种类。 class Program /类 int x=1; / x是非静态变量 public static int y=2; / y是静态变量 void f(int s, int val, ref int i, out int j) /数组s,值参数val
16、 int w=2; / w是局部变量 j=x+y+i+w; / j是输出参数 x是非静态变量,y是静态变量,s是数组, val是值参数,i是引用参数,j是输出参数。,2.2.4 常量和字量,常量声明的语法为: 修饰符 const 类型 ConstName; 在声明常量时,要用到const关键字。 下面是一个声明常量的例子: public const double PI = 3.1415926; 字量 字量就是类型的字面值。它与常量本质上相同,但它更加简单:不用声明,把值直接写出来即可。例如,下面语句中出现的123就是整数字量: int i=123;,字符串字量,string s3 = “Hel
17、lo n World!”; /串包含转义序列n, 换行 Console.WriteLine(“0“, s3); 运行结果: Hello World! 逐字字符串字量 逐字字符串字量由字符和后面双引号中的多个字符组成,如果包含转义序列或Unicode字符,都作为一般字符处理。即“转义”失效。例如: string s1 = “Hello World!“; /有字符的串 string s2 = “Hello n World!“; /串包含转义序列n, 但作为二个一般字符处理,即:和n Console.WriteLine(“0 1“, s1, s2); 运行结果: Hello World! Hello
18、 n World!,空字量,空字量只有一个:null。 null本质的含义是没有任何值,即“空”。 null不属于任何类型,但它可隐式地转换为任何可接受空值的类型,如引用类型。 字符串和object都是引用类型, 所以下面语句是正确的: string st = null; / null不等价于无字符的串 “ object obj = null; /表示obj没有任何值,可空类型 int?,但下面的语句不正确: int i = null; 简单类型不是可空类型, 所以int类型的变量不接受null 因此C#提供了“可空类型”这种语法, 只要在任何“不可空”的类型后加?就构成了可空的类型,如“in
19、t?”,所以下面语句是正确的: int? i = null; float? f=null;,2.3 类型,计算机科学家Wirth提出过一个公式: 算法 + 数据结构 = 程序 数据结构在.NET中的形式就是公共类型系统,简称类型(Type)。 一个变量用于连接一个名称(变量名) 和一小块内存。 一个变量有它的值,也就是这小块内存中存储的值。 至于这小块内存的大小, 以及如何解释其中存储的数据,是和变量的类型相关的。,整个C#类型系统,2.3.1 类型的分类,1)值类型和引用类型(分类方法1) 如果按变量存储的是数据还是数据的引用来区分,C#类型(或CTS)可分为值类型和引用类型,见下图。,进一
20、步划分,值类型进一步划分: 简单类型(simple type) 枚举类型(enum type) 结构类型(struct type) 引用类型进一步划分: 类类型(class type) 接口类型(interface type) 数组类型(array type) 委托类型(delegate type) 字符串类型(string type),代码例子,值类型变量直接包括它们的数据, 而引用类型变量存储的是它们的数据引用(即对象引用)。例如: int i = 1; / i是值类型变量,1 直接存储在i中。 object obj = new object(); obj是引用类型变量, obj存储的是对
21、象的引用。,如何理解引用类型,“引用类型到底是什么东西啊?” 我们用比喻法来回答您的问题。 计算机的内存是用于存放数据的,所以内存好比是房屋。 只有二种房屋:一种是“堆”,另一种是“栈”。 但每种房屋会有许多房间,用“房间号”区分它们,“房间号”其实就是内存地址。 double x = 12.3; /x是值类型变量,12.3直接存储在x中。 double y = x; /y是值类型变量,y=x导致12.3存储在y中。 string s1 = new string(w, 3); /s1是引用类型变量,s1存储的是地址0x01-对象的引用。 string s2 = “Hello“; /s2存储的是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 组件 编程 科学出版社
链接地址:https://www.31doc.com/p-2618668.html