




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章 C程序设计基础,第一个C#程序Hello,World!,创建控制台应用程序 完整对象路径命名空间名.类名 例如,如何访问System.Text.StringBuilder类? System.Text.StringBuilder using System.Text; Console.WriteLine(“Hello,World!”); 调试运行F5, 非调试运行CtrlF5(忽略断点),CTS(Common Type System)是一个所有.NET语言都支持的数据类型(或者说中间语言(IL)中使用的预定义数据类型)的集合,确保这些语言可以相互传送数据,体现了.NET语言的互操作性。 值类型直接存储其值,存储在堆栈Stack中;而引用类型存储对其值的内存地址的引用,存储在运行库托管堆heap中。 我们必须在设计类型的时候就决定类型实例的行为。这种决定非常重要,用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 their code.)”。这就要求我们正确理解和使用值类型和引用类型。 关于正确理解和使用值类型和引用类型,参见/yandixin/archive/2008/03/03/truly-understand-csharp-value-type-and-reference-type.html,C的值类型和引用类型,具体的值类型和引用类型见课本P31 P38 C数据类型不过是CTS类型的别名而已。 如,int只不过是System.Int32的马甲(别名)而已 即int i; 可以用 System.Int32 i; 代替 Framework Design Guidelines一书中说:我们要避免在标志符中使用语言特有的名字(别名)来称呼它们。因为别名没有增加任何价值,反而引起了大量的混淆。 所以,常用的Convert.ToInt32()而不是ToInt(),Convert.ToInt64()而不是ToLong()。,C#的命名规范,参见 /zh-cn/library/ms229002(VS.80).aspx 标识符 大小写方式 示例 类 Pascal AppDomain 接口 Pascal IDisposable 方法 Pascal ToString 命名空间 Pascal System.Drawing 参数 Camel typeName 属性 Pascal BackColor 枚举类型 Pascal ErrorLevel 枚举值 Pascal FatalError 事件 Pascal ValueChanged 异常类 Pascal WebException 只读的静态字段Pascal RedValue,装箱boxing 拆箱unboxing,装箱 将一个值类型实例转换为一个相同内容的引用类型实例 当想把值类型实例作为某方法(参数定义为引用类型)的参数时,装箱发生 基于CLR的语言隐藏了装箱过程,程序员不需显式转换,但带来性能上的问题 例: int i = 1; object o = i; / boxing int j = (int) o; / unboxing 拆箱 装箱的逆过程,需显式转换 如果应用程序频繁地把值类型变量作为对象处理,最好最初使用引用类型声明。,类型转换,隐式转换 编译器自动进行 byte bData = 20; int iCount = bData;,int iCount = 20; byte bData = iCount ;,编译通过,报错,为什么?,显式转换 上面的错误怎么修改才能编译通过? int iCount = 20; byte bData = (byte)iCount ; 但是,显示转换时可能会发生截断或溢出。,强制转换 数值字符串数值,如,”123”123 Convert类:将一个基本数据类型转换为另一个基本数据类型 string str = “123“; int i = Convert.ToInt32(str); Console.WriteLine(“Int32: 0”, i); Parse方法: 将数字的字符串表示形式转换为它的等效 32 位有符号整数。一个指示操作是否成功的返回值。 string str = “123“; Int32 int32Val; Int32.TryParse(str, out int32Val); Console.WriteLine(“Int32: 0“, int32Val); 数值数值字符串,如,123 ” 123 ” Convert.ToString()方法 各数值类型的ToString()方法,String to DateTime string str = “2008-2-10 11:00:00“; DateTime dt = new DateTime(); dt = DateTime.Parse(str); Console.WriteLine(“DateTime: 0“, dt); DateTime to String dt = System.DateTime.Now; String MyString; MyString = dt.ToString(); Console.WriteLine(“DateTime: 0“, dt);,字符串常用操作,字符串常用操作 Length属性、ToCharArray()方法(打散)、SubString()方法(截取)、IndexOf()(字符匹配)、PadLeft()(填充)、Replace()、Splite()、Format()、Concat()、Join()等 System.Text.StringBuilder类:4个以上字符串连接时,更高的性能 string returnNumber = “; for(int i = 0; i1000; i+) returnNumber = returnNumber + i.ToString(); String 对象一旦生成不可改变(Immutable).每次使用 System.String 类中的方法时,都要在内存中创建一个新的字符串对象,而且为该新对象分配新的空间。 原来的内存空间等待垃圾回收器回收。,String returnNumber = “; 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); Console.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: 359 StringBuilder: 15,字符串比较(=、Equals or CompareTo?),Equals 比较两个对象是否相等,即两个对象是否包含相同的内容 也就是比较引用类型是否是对同一个对象的引用 equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。 = 比较基本数据类型,如果两个值相同,则结果为true 比较引用时,如果引用指向内存中的同一对象,结果为true =操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 CompareTo 相等返回0,class Test static void Main(string args) / Create two equal but distinct strings string a = new string(new char h, 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); 字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。,True True False True,=、Equals or CompareTo?,对只关心内容的引用类型 直接使用Equals 也可以使用=,但一定要做转化,比如ToString()方法 对值类型,使用可读性较好的,集合,一定要谨慎选择 System.Collections 类 当需要大小可按需动态增加,并希望通过索引来进行访问的数组的时候,使用ArrayList . 当需要一个能实现后进先出的集合时,使用Stack. 当需要一个先进先出的集合时,使用Queue. 当需要一个可以按Key值来查询的数组是,使用Hashtable. 当需要一个按顺序排列的集合时,SortedList.,C#的控制结构,foreach语句,允许迭代(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); for语句和foreach语句的区别: for的代码块中可以更改迭代元素的值,而foreach不能 foreach比for有更快的执行效率,类,与Java类基本相同 C类内可包含字段( Attribute )、方法和属性( Property ) 属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码,如 class TimePeriod private double seconds; public double Hours get return seconds / 3600; set seconds = value * 3600; ,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); 尽量不要公开字段,属性是更好的选择。,Property 属性,许多类型都定义了可以被检索或者修改的状态信息。通常情况下,这些状态信息作为类型的字段成员实现。例如 public sealed class Employee public String Name; /员工姓名 public Int32 Age; /员工年龄 用下述形式的代码很容易地获得或者设置对象的状态信息: Employee e = new Employee(); e.Name = “Jeffrey Richter“; /设置员工姓名 e.Age = 41; /设置员工年龄 Console.WriteLine(e.Name); /显示 “Jeffrey Richter“ 但是,开发人员可以使用下述形式的代码很容易地破坏对象Employee: e.Age=-5; /怎么会有人是-5岁呢?,于是,将前述代码重写为下述形式: public sealed class Employee private String m_Name; /私有字段 private Int32 m_Age; /私有字段 public String GetName() return(m_Name); public void SetName(String value) 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; ,e.SetName(“Jeffrey Richter“); /更新员工姓名 String EmployeeName = e.GetName();/检索员工姓名 e.SetAge(41); /更新员工年龄 e.SetAge(-5); /抛出ArgumentOutOfRangeException异常 Int32 EmployeeAge = e.GetAge();/检索员工年龄 我们看到数据密封有两个缺点:首先,因为不得不实现额外的方法,所以必须编写更多的代码;其次,类型的用户必须调用方法,而不能简单地引用一个单独的字段名。 就个人而言,我认为这些缺点微不足道。尽管如此,编程语言和CLR还是提供了一种称为属性的机制减轻了第一个缺点的影响并完全消除了第二个缺点的影响。,public sealed 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 must be greater than or equal to 0“); _Age = value; ,于是,我们可以 e.Name = “Jeffrey Richter“; /“设置”员工姓名 String EmployeeName = e.Name; /“获取”员工姓名 e.Age = 41; /“设置”员工年龄 e.Age = -5; /抛出ArgumentOutOfRangeException异常 Int32 EmployeeAge = e.Age; /“获取”员工年龄,编译器编译这个类型时,编译器会发现其中定义的Name和Age两个属性。因为这两个属性都有get和set访问器方法,所以编译器将在Employee类型中生成4个get、set方法定义,就像第22页ppt所示,C# 接口 - what is interface,An interface looks like a class, but has no implementation. The only thing it contains are definitions of events, indexers, methods and/or properties. The reason interfaces only provide definitions is because they are inherited by classes and structs, which must provide an implementation for each interface member defined.,C#接口,一个类实现了某个接口,就相当于声明其能够完成某项工作。比如一个类实现了IComparable接口,就相当于声明了它可以完成对自身实例进行比较的工作。 举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵.所以现在的程序希望换了打印机后也少量修改就可用. 方法: 1,定义一个打印机接口. 2,定义打印机类A,B,分别实现此接口. 3,定义一个工厂类,在类中可选择返回由A实现的接口,或者由B实现的接口. 4,在程序中使用打印机时,就可以使用工厂类来调用打印机,而不需要知道具体的是什么打印机. 如果打印机换了,只需要修改工厂类就行了.如果有一千个地方都调用过打印机,就不需要一个一个修改.修改一个地方就行了.接口充当一个隔离层的作用.,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 true; ,class PrintFactory p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 15072.6-2025贵金属合金化学分析方法第6部分:铱含量的测定
- 2025安徽淮南高新区部分学校引进紧缺专业人才招聘39人模拟试卷及答案详解(考点梳理)
- 2025北京海淀第十九中学教师招聘模拟试卷及答案详解(必刷)
- 2025湖南湘潭市韶山思政教育实践中心公开招聘教师2人模拟试卷及一套答案详解
- 2025年铜川市为县以下医疗卫生机构定向招聘笔试模拟试卷及答案详解(网校专用)
- 2025届中国兵器装备春季校园招聘模拟试卷及答案详解(典优)
- 2025湖南开放大学高层次人才公开招聘25人模拟试卷及完整答案详解1套
- 2025贵州遵义医科大学第二附属医院第十三届贵州人才博览会引才17人考前自测高频考点模拟试题(含答案详解)
- Ifoxetine-CGP-15210G-生命科学试剂-MCE
- Human-YAP1-mRNA-生命科学试剂-MCE
- 风力发电机组的建模与仿真技术研究
- 驾考宝典三力测试考试试题及答案
- 骨科围手术期的护理流程
- 不明原因肺炎病例监测、排查和管理方案2025年修订版
- 呼吸衰竭护理疑难病例讨论
- 熠星创新创业大赛
- 高考英语阅读理解1200个高频
- 2025安全生产法律法规专题知识培训
- 《狼来了》寓言故事演讲课件
- 《瑞吉欧课程模式》课件
- 特种作业电工安全培训
评论
0/150
提交评论