C#课程总结报告(共11页).docx





《C#课程总结报告(共11页).docx》由会员分享,可在线阅读,更多相关《C#课程总结报告(共11页).docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上知识点1:引用和值类型总结从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不同地方。在C#中,我们必须在设计类型的时候就决定类型实例的行为。这种决定非常重要,用CLR via C#作者Jeffrey Richter的话来 说,“不理解引用类型和值类型区别的程序员将会给代码引入诡异的bug和性能问题(I believe that a developer who misunderstands the difference between reference types and value types will introduce subt
2、le bugs and performance issues into their code.)”。这就要求我们正确理解和使用值类型和引用类型。1. 通用类型系统C#中,变量是值还是引用仅取决于其数据类型。C#的基本数据类型都以平台无关的方式来定义。C#的预定义类型并没有内置于语言中,而是内置于.NET Framework中。.NET使用通用类型系统(CTS)定义了可以在中间语言(IL)中使用的预定义数据类型,所有面向.NET的语言都最终被编译为 IL,即编译为基于CTS类型的代码。例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。这具有重要的意义:
3、确保IL上的强制类型安全; 实现了不同.NET语言的互操作性; 所有的数据类型都是对象。它们可以有方法,属性,等。例如: int i;i = 1;string s;s = i.ToString();MSDN的这张图说明了CTS中各个类型是如何相关的。注意,类型的实例可以只是值类型或自描述类型,即使这些类型有子类别也是如此。2. 值类型C#的所有值类型均隐式派生自System.ValueType:结构体:struct(直接派生于System.ValueType);数值类型: 整 型:sbyte(System.SByte的别名),short(System.Int16),int(System.Int
4、32),long (System.Int64),byte(System.Byte),ushort(System.UInt16),uint (System.UInt32),ulong(System.UInt64),char(System.Char); 浮点型:float(System.Single),double(System.Double); 用于财务计算的高精度decimal型:decimal(System.Decimal)。 bool型:bool(System.Boolean的别名); 用户定义的结构体(派生于System.ValueType)。 枚举:enum(派生于System.Enu
5、m); 可空类型(派生于System.Nullable泛型结构体,T?实际上是System.Nullable的别名)。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。例如:int i = new int();等价于:Int32 i = new Int32();等价于:int i = 0;等价于:Int32 i = 0;使用new运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。在上例中,默认构造函数将值0赋给了i。MSDN上有完整的默认值表。关于int和Int32的细节,在我的另一篇文章中有详细解释:理解C#中的System.Int32和int。所有的值类型都是密封(sea
6、l)的,所以无法派生出新的值类型。值得注意的是,System.ValueType直接派生于System.Object。即System.ValueType本身是一个类类型,而 不是值类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。可以用Type.IsValueType属性来判断一个类型是否为值类型:复制代码 代码如下:TestType testType = new TestType ();if (testTypetype.GetType().IsValueType)Console.WriteLine(0 is value typ
7、e., testType.ToString();3. 引用类型C#有以下一些引用类型:数组(派生于System.Array) 用户用定义的以下类型: 类:class(派生于System.Object); 接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在C# Programming Language中说,接口只是表示一种约定contract); 委托:delegate(派生于System.Delegate)。 object(System.Object的别名); 字符串:string(System.String的别名)。可以看出:引用类型与值类型相同的是,
8、结构体也可以实现接口; 引用类型可以派生出新的类型,而值类型不能; 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型); 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。对于最后一条,经常混淆的是string。我曾经在一本书的一个早期版本上看到String变量比string变量效率高;我还经常听说String是引用类型,string是值类型,等等。例如:string s1 = Hello, ;string s2 = world!;string s3 = s1 + s2;/s3 is Hello,
9、world!这确实看起来像一个值类型的赋值。再如:string s1 = a;string s2 = s1;s1 = b;/s2 is still a改变s1的值对s2没有影响。这更使string看起来像值类型。实际上,这是运算符重载的结果,当s1被改变时,.NET在托管堆上为s1重新分配了内存。这样的目的,是为了将做为引用类型的string实现为通常语义下的字符串。4. 总结C#中,变量是值还是引用仅取决于其数据类型。C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。数组的元素,不管是
10、引用类型还是值类型,都存储在托管堆上。引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。为了方便,本文简称引用类型部署在托管推上。值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。应该尽可能地将值类型实现为具有常量性和原子性的类型。应该尽可能地确保0为值类型的有效状态。应该尽可能地减少装箱和拆箱。知识点2:封装可以把程序按某种规则分成很多“块“,块与块之间可能会有联系,每个块都有一个可变部分和一个稳定的部分。我们需要把
11、可变的部分和稳定的部分分离出来,将稳定的部分暴露给其他块,而将可变的部分隐藏起来,以便于随时可以让它修改。这项工作就是封装。例如:在用类实现某个逻辑的时候,类就是以上所说的块,实现功能的具体代码就是可变的部分,而public的方法或者属性则是稳定的部分。封装的意义封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的原素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat
12、e)在很多方面会更好。私有的数据可以用两种方式来间接的控制。下面我们看一些c#例子来学习这两种方法用以封装数据。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。无论我们使用哪种的方法,我们的目标是在使用数据的同时不能使它受到任何的破坏和改变。有如下好处1、 使用者只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法。2、 高内聚,低耦合一直是我们所追求的,用好封装恰恰可以减少耦合3、 只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化4、 类具有了简洁清晰的对外接口,降低了使用者的学习过程用传统的读、写方法封装让我们来看一个例
13、子有一个类Grade(年级信息类),为了操纵这个类中的数据(stringgradeName(年级名称)我们定义了一个读方法和一个写方法。 using system; public class Grade private string gradeName; . / 读方法 public string GetGradeName() return gradeName; /写方法 public void SetGradeName(string gradeName) this.gradeName=gradeName; 通过上面的方法,我们可以保护私有数据不被外部程序所破坏。现在我们使用两个不同的方法来写
14、和读数据public staticvoid Main(string args)Grade grade = new Grade();grade.SetGradeName(S2)Console.WriteLine(TheGrade is :+grade.GetGradeName();在上面的例子中,我们不能直接访问类Grade的实例grade中的私有数据(stringgradeName),我们只能通过这两个方法来访问。用属性来实现封装属性是c#引入的一种语言成分,只有很少的语言支持属性。通过对属性的读和写来保护类中的域。第一种方法体身也是一种好的方式,但用属性来实现封装会更方便。现在我们来看一个例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 课程 总结报告 11

限制150内