版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、dotnet02C#程序设计基础第二章 C程序设计基础dotnet02C#程序设计基础第一个第一个C#程序程序Hello,World!n创建控制台应用程序创建控制台应用程序n完整对象路径命名空间名完整对象路径命名空间名.类名类名n例如,如何访问例如,如何访问System.Text.StringBuilder类?类?System.Text.StringBuilder using System.Text;nConsole.WriteLine(“Hello,World!”);n调试运行调试运行F5, 非调试运行非调试运行CtrlF5(忽略断点)(忽略断点)dotnet02C#程序设计基础nCTS(C
2、ommon Type System)是一个所有)是一个所有.NET语言都支持的语言都支持的数据数据类型类型(或者说中间语言(或者说中间语言(IL)中使用的预定义数据类型)的)中使用的预定义数据类型)的集合集合,确,确保这些语言可以相互传送数据,体现了保这些语言可以相互传送数据,体现了.NET语言的互操作性。语言的互操作性。 n值类型值类型直接存储其值,存储在直接存储其值,存储在堆栈堆栈Stack中;而中;而引用类型引用类型存储存储对其值对其值的内存地址的引用的内存地址的引用,存储在运行库托管,存储在运行库托管堆堆heap中。中。n我们必须在设计类型的时候就决定类型实例的行为。这种决定非常重我们
3、必须在设计类型的时候就决定类型实例的行为。这种决定非常重要,用要,用CLR via C#作者作者Jeffrey Richter的话的话来说,来说,“不理解引不理解引用类型和值类型区别的程序员将会给代码引入诡异的用类型和值类型区别的程序员将会给代码引入诡异的bug和性能问题和性能问题(I believe that a developer who misunderstands the difference between reference types and value types will introduce subtle bugs and performance issues into th
4、eir code.)”。这就要求我。这就要求我们正确理解和使用值类型和引用类型。们正确理解和使用值类型和引用类型。n关于正确理解和使用值类型和引用类型,参见关于正确理解和使用值类型和引用类型,参见C的值类型和引用类型的值类型和引用类型dotnet02C#程序设计基础n具体的值类型和引用类型见课本具体的值类型和引用类型见课本P31 P38nC数据类型不过是数据类型不过是CTS类型的别名而已。类型的别名而已。n如,如,int只不过是只不过是System.Int32的马甲(别名)的马甲(别名)而已而已n即即int i; 可以用可以用 System.Int32 i; 代替代替nFramework De
5、sign Guidelines一书中说:我们要一书中说:我们要避免在标志符中使用语言特有的名字(别名)避免在标志符中使用语言特有的名字(别名)来称呼它们。来称呼它们。因为别名没有增加任何价值,反而引起了大量的混淆。因为别名没有增加任何价值,反而引起了大量的混淆。n所以,常用的所以,常用的Convert.ToInt32()而不是而不是ToInt(),Convert.ToInt64()而不是而不是ToLong()。 dotnet02C#程序设计基础C#的命名规范的命名规范n参见参见 (VS.80).aspxn标识符标识符 大小写方式大小写方式 示例示例 n类类PascalAppDomain n接口
6、接口PascalIDisposable n方法方法PascalToString n命名空间命名空间PascalSystem.Drawing n参数参数CameltypeName n属性属性PascalBackColor n枚举类型枚举类型PascalErrorLevel n枚举值枚举值PascalFatalError n事件事件PascalValueChanged n异常类异常类PascalWebException n只读的静态字段只读的静态字段PascalRedValue dotnet02C#程序设计基础装箱装箱boxing 拆箱拆箱unboxingn装箱装箱将一个将一个值类型值类型实例实例
7、转换为转换为一个相同内容的一个相同内容的引用类型引用类型实例实例当想把值类型实例作为某方法(参数定义为引用类型)的参数时,当想把值类型实例作为某方法(参数定义为引用类型)的参数时,装箱发生装箱发生基于基于CLR的语言隐藏了装箱过程,程序员不需显式转换,但带来的语言隐藏了装箱过程,程序员不需显式转换,但带来性能上的问题性能上的问题例:例:int i = 1; object o = i; / boxing int j = (int) o; / unboxing n拆箱拆箱装箱的逆过程,需显式转换装箱的逆过程,需显式转换n如果应用程序频繁地把值类型变量作为对象处理,最好最初使用引用如果应用程序频繁地
8、把值类型变量作为对象处理,最好最初使用引用类型声明。类型声明。 dotnet02C#程序设计基础类型转换类型转换n隐式转换隐式转换编译器自动进行编译器自动进行byte bData = 20; int iCount = bData; int iCount = 20; byte bData = iCount ;编译通过编译通过报错,为什么?报错,为什么?n显式转换显式转换上面的错误怎么修改才能编译通过?上面的错误怎么修改才能编译通过?int iCount = 20; byte bData = (byte)iCount ;但是,显示转换时可能会发生截断或溢出。但是,显示转换时可能会发生截断或溢出。d
9、otnet02C#程序设计基础n强制转换强制转换数值字符串数值字符串数值,如,数值,如,”123”123nConvert类:类:将一个基本数据类型转换为另一个基本数据类型将一个基本数据类型转换为另一个基本数据类型 string str = 123;int i = Convert.ToInt32(str);Console.WriteLine(“Int32: 0”, i);nParse方法方法: 将数字的字符串表示形式转换为它的等效将数字的字符串表示形式转换为它的等效 32 位有符号整数。一个指示操作是否成功的返回值。位有符号整数。一个指示操作是否成功的返回值。 string str = 123;
10、Int32 int32Val;Int32.TryParse(str, out int32Val);Console.WriteLine(Int32: 0, int32Val);数值数值数值字符串,如,数值字符串,如,123 ” 123 ”nConvert.ToString()方法方法n各数值类型的各数值类型的ToString()方法方法dotnet02C#程序设计基础nString to DateTime string str = 2008-2-10 11:00:00;DateTime dt = new DateTime();dt = DateTime.Parse(str);Console.Wr
11、iteLine(DateTime: 0, dt);nDateTime to String dt = System.DateTime.Now;String MyString;MyString = dt.ToString();Console.WriteLine(DateTime: 0, dt);dotnet02C#程序设计基础字符串常用操作字符串常用操作n字符串常用操作字符串常用操作Length属性、ToCharArray()方法(打散)、SubString()方法(截取)、IndexOf()(字符匹配)、PadLeft()(填充)、Replace()、Splite()、Format()、Conc
12、at()、Join()等nSystem.Text.StringBuilder类:类:4个以上字符串连接时,更高的性能个以上字符串连接时,更高的性能string returnNumber = ;for(int i = 0; i1000; i+) returnNumber = returnNumber + i.ToString(); String 对象一旦生成不可改变(Immutable).每次使用 System.String 类中的方法时,都要在内存中创建一个新的字符串对象,而且为该新对象分配新的空间。原来的内存空间等待垃圾回收器回收。dotnet02C#程序设计基础String returnN
13、umber = ;StringBuilder sb = new StringBuilder();DateTime startDateTimeString;DateTime startDateTimeStringBuilder;TimeSpan ts;startDateTimeString = DateTime.Now;returnNumber = ; for (int i = 0; i 10000; i+) returnNumber = returnNumber + i.ToString(); ts = DateTime.Now.Subtract(startDateTimeString); C
14、onsole.WriteLine(String: 0, ts.Milliseconds); startDateTimeStringBuilder = DateTime.Now; for (int i = 0; i 10000; i+) sb.Append(i.ToString(); returnNumber = sb.ToString(); ts = DateTime.Now.Subtract(startDateTimeStringBuilder); Console.WriteLine(StringBuilder:0, ts.Milliseconds);运行结果:String: 359Stri
15、ngBuilder: 15dotnet02C#程序设计基础字符串比较字符串比较(=、Equals or CompareTo?)nEquals比较两个比较两个对象对象是否相等,即两个对象是否包含是否相等,即两个对象是否包含相同的内容相同的内容也就是比较引用类型是否是对同一个对象的引用也就是比较引用类型是否是对同一个对象的引用 equals操作表示的两个变量是否是对同一个对象的引用,即堆中操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。的内容是否相同。 n=比较比较基本数据类型基本数据类型,如果两个,如果两个值相同值相同,则结果为,则结果为true 比较比较引用引用时,如果引用时
16、,如果引用指向内存中的同一对象指向内存中的同一对象,结果为,结果为true=操作比较的是两个变量的值是否相等,对于引用型变量表示的操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 nCompareTo相等返回相等返回0dotnet02C#程序设计基础class Test static void Main(string args) / Create two equal but distinct strings string a = new string(new char h,
17、 e, l, l, o ); string b = new string(new char h, e, l, l, o ); Console.WriteLine(a = b); Console.WriteLine(a.Equals(b); / Now lets see what happens with the same tests but / with variables of type object object c = a; object d = b; Console.WriteLine(c = d); Console.WriteLine(c.Equals(d); 字符串是一个特殊的引用
18、型类型,在字符串是一个特殊的引用型类型,在C#语言中,重载了语言中,重载了string 对象的很对象的很多方法方法多方法方法(包括包括equals()方法方法),使,使string对象用起来就像是值类型对象用起来就像是值类型一样。一样。 TrueTrueFalseTruedotnet02C#程序设计基础=、Equals or CompareTo?n对只关心内容的对只关心内容的引用类型引用类型直接使用直接使用Equals也可以使用也可以使用=,但一定要做转化,比如,但一定要做转化,比如ToString()方法方法n对值类型,使用可读性较好的对值类型,使用可读性较好的dotnet02C#程序设计基
19、础集合集合n一定要谨慎选择一定要谨慎选择 System.Collections 类类 当需要当需要大小可按需动态增加大小可按需动态增加,并希望,并希望通过索引来进行通过索引来进行访问访问的数组的时候,使用的数组的时候,使用ArrayList .当需要一个能实现当需要一个能实现后进先出后进先出的集合时,使用的集合时,使用Stack.当需要一个当需要一个先进先出先进先出的集合时,使用的集合时,使用Queue.当需要一个可以当需要一个可以按按Key值来查询值来查询的数组是,使用的数组是,使用Hashtable.当需要一个当需要一个按顺序排列按顺序排列的集合时的集合时,SortedList.dotne
20、t02C#程序设计基础C#的控制结构的控制结构nforeach语句,允许迭代语句,允许迭代(iterates)某个集合某个集合(Collection)类型内的所有类型内的所有元素元素string arrString = Tom,Jack,Mickey;foreach (string s in arrString) Console.WriteLine(s);int arrList = 1,2,3,4;foreach (int i in arrList) Console.WriteLine(i);nfor语句和语句和foreach语句的区别:语句的区别:for的代码块中可以更改迭代元素的值,而的代
21、码块中可以更改迭代元素的值,而foreach不能不能foreach比比for有有更快的执行效率更快的执行效率dotnet02C#程序设计基础类类n与与Java类基本相同类基本相同nC类内可包含类内可包含字段(字段( Attribute )、方法和、方法和属性属性( Property )n属性属性使类能够以一种公开的方法获取和设置值,同时隐藏使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码,如实现或验证代码,如 class TimePeriod private double seconds; public double Hours get return seconds / 3600;
22、 set seconds = value * 3600; dotnet02C#程序设计基础class Program static void Main() TimePeriod t = new TimePeriod(); / Assigning the Hours property导致导致 set 访问器访问器(accessor)被调用被调用. t.Hours = 24; / Evaluating the Hours property导致导致get访问器访问器( accessor)被调用被调用. System.Console.WriteLine(Time in hours: + t.Hours
23、); n尽量不要公开字段,属性是更好的选择尽量不要公开字段,属性是更好的选择。dotnet02C#程序设计基础Property 属性n许多类型都定义了可以被检索或者修改的状态信息。通常情况下,这些状态信息作为类型的字段成员实现。例如npublic sealed class Employee n public String Name; /员工姓名n public Int32 Age; /员工年龄n n用下述形式的代码很容易地获得或者设置对象的状态信息:nEmployee e = new Employee(); ne.Name = Jeffrey Richter; /设置员工姓名ne.Age =
24、41; /设置员工年龄nConsole.WriteLin); /显示 Jeffrey Richtern但是,开发人员可以使用下述形式的代码很容易地破坏对象Employee:ne.Age=-5; /怎么会有人是-5岁呢?dotnet02C#程序设计基础于是,将前述代码重写为下述形式:public sealed class Employee private String m_Name; /私有字段 private Int32 m_Age; /私有字段 public String GetName() return(m_Name); public void SetName(String value)
25、m_Name = value; public Int32 GetAge() return(m_Age); public void SetAge(Int32 value) if (value 0) throw new ArgumentOutOfRangeException(value, value.ToString(), The value must be greater than or equal to 0); m_Age = value; dotnet02C#程序设计基础ne.SetName(Jeffrey Richter); /更新员工姓名nString EmployeeName = e.
26、GetName();/检索员工姓名ne.SetAge(41); /更新员工年龄ne.SetAge(-5); /抛出ArgumentOutOfRangeException异常nInt32 EmployeeAge = e.GetAge();/检索员工年龄n我们看到数据密封有两个缺点:首先,因为不得不实现额外的方法,所以必须编写更多的代码;其次,类型的用户必须调用方法,而不能简单地引用一个单独的字段名。n就个人而言,我认为这些缺点微不足道。尽管如此,编程语言和CLR还是提供了一种称为属性的机制减轻了第一个缺点的影响并完全消除了第二个缺点的影响。dotnet02C#程序设计基础public seale
27、d class Employee private String _Name; / 添加_避免命名冲突 private Int32 _Age; / 添加_避免命名冲突 public String Name get return(_Name); set _Name = value; /关键字value通常表示新设的值 public Int32 Age get return(_Age); set if (value 0) /关键字value通常表示新设的值 throw new ArgumentOutOfRangeException(value, value.ToString(), The value
28、 must be greater than or equal to 0); _Age = value; dotnet02C#程序设计基础n于是,我们可以ne.Name = Jeffrey Richter; /“设置”员工姓名nString EmployeeName = e.Name; /“获取”员工姓名ne.Age = 41; /“设置”员工年龄ne.Age = -5; /抛出ArgumentOutOfRangeException异常nInt32 EmployeeAge = e.Age; /“获取”员工年龄dotnet02C#程序设计基础n编译器编译这个类型时,编译器会发现其中定义的Name和
29、Age两个属性。因为这两个属性都有get和set访问器方法,所以编译器将在Employee类型中生成4个get、set方法定义,就像第22页ppt所示dotnet02C#程序设计基础C# 接口接口 - what is interfacenAn interface looks like a class, but has no implementation. nThe only thing it contains are definitions of events, indexers, methods and/or properties. nThe reason interfaces only p
30、rovide definitions is because they are inherited by classes and structs, which must provide an implementation for each interface member defined.dotnet02C#程序设计基础C#接口接口n一个类实现了某个接口,就相当于声明其一个类实现了某个接口,就相当于声明其能够完成某项工作能够完成某项工作。比如一。比如一个类实现了个类实现了IComparable接口,就相当于声明了它可以完成对自身实接口,就相当于声明了它可以完成对自身实例进行比较的工作。例进行比较
31、的工作。 n举个例子举个例子:某公司有一台特殊打印机某公司有一台特殊打印机,还可以使用一年还可以使用一年,一年后可能换为另一年后可能换为另一种打印机一种打印机,这两种打印机都特殊而贵这两种打印机都特殊而贵.所以现在的程序希望换了打印机所以现在的程序希望换了打印机后也少量修改就可用后也少量修改就可用.方法方法:1,定义一个打印机接口定义一个打印机接口.2,定义打印机类定义打印机类A,B,分别实现此接口分别实现此接口.3,定义一个工厂类定义一个工厂类,在类中可选择返回由在类中可选择返回由A实现的接口实现的接口,或者由或者由B实现的接实现的接口口.4,在程序中使用打印机时在程序中使用打印机时,就可以
32、使用工厂类来调用打印机就可以使用工厂类来调用打印机,而不需要知而不需要知道具体的是什么打印机道具体的是什么打印机.如果打印机换了如果打印机换了,只需要修改工厂类就行只需要修改工厂类就行了了.如果有一千个地方都调用过如果有一千个地方都调用过打印机打印机,就不需要一个一个修改就不需要一个一个修改.修改一个地方就行了修改一个地方就行了.接口充当一个隔离接口充当一个隔离层的作用层的作用.dotnet02C#程序设计基础interface IPrint bool PrintData(string data); class CanonPrint : IPrint public virtual bool PrintData(string data) /具体业务逻辑具体业务逻辑 Console.WriteLine(data); return true; class HPPrint : IPrint public virtual bool PrintData(string data) /具体业务逻辑略具体业务逻辑略 Console.WriteLine(data); return tr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司内部审计流程与风险控制实务
- 工程质量验收标准操作流程
- 自来水企业客户服务提升方案
- 工业制造安全操作规程与风险预防
- 皮肤科医疗建设及服务提升计划书
- 小学科学探究性学习教学活动设计
- 建筑工程招投标管理办法解读
- 精益生产管理工具与现场改善案例
- IT项目开发风险识别与应对
- 高三英语一轮复习模拟试题解析
- 2025年中级消防监控题库及答案
- 隧道施工废水处理人员培训方案
- 2025年射频识别技术面试题库及答案
- 拣货主管年终总结
- 糖尿病重症患者肠内营养血糖调控方案
- 安保部月度工作总结
- 【语文】四川省成都市实验小学小学一年级上册期末试卷(含答案)
- GB/T 28159-2025电子级磷酸
- 槐乡五月课件
- 人防平战转换课件
- 2025年军事理论知识竞赛题库及答案
评论
0/150
提交评论