初二数学知识点,高级编程第一章:体系结构 相关知识点

题外话:来园子也有一段时间了,惭愧一直没有发表什么文章,深度潜水的这段时光中也看了不少好文,最近一同学问我学什么重要,我个人认为基础与原理性的东西才是重中之重,可惜我们这连《数据结构》《计算机组成原理和编译原理》等常规课程都没有上过,C语言也只是皮毛,算法的水平就更不好意思说了,还得从头恶补。我的另一个爱好是软件安全与调试逆向,可惜连80X86汇编,386保护模式,Windows机制等基础知识掌握的都很一般,最近也在重新看Win32 汇编 ,希望能补补。
最近打算系统的看下《C#高级编程第六版》,《CLR via C#第三版》与数据库相关知识,借此宝地记录下书中个人认为基础但又很重要的知识点(不系统记录了),也会扩展一些相关知识,今写此文的时候笔者也开启了大三旅程,也希望通过这样的方式记录这两年所学的.Net知识,好面对即将面临的"养家糊口"问题,任重而道远。也希望与园子里共鸣的朋友共勉!
导读:第一章主要讲解写概念性的东西,可能有点抽象, 个人认为需要系统了解的知识点概况如下
1.1 理解知识点 >> 值类型与引用类型 >> 异常处理(略) >> 中间语言(IL的理解很重要,需要了解的可以参考 MSDN, 《CLR via C#第三版》,看雪《微软.NET程序的加密与解密》,Anytao的《你必须知道的.Net第二版》等) >> 命名空间(略) >> 应用程序域(参考了《加密解密三》中基础篇)
1.2 了解概念(了解概念,暂不讨论) >> 面向对象 >> 垃圾回收 >> 特性(Attribute) >> 程序集(Assembly) >> 反射 1.3 小结 >>特性的编译过程
>> 值类型与引用类型
1 .数据类型
在C#中,数据类型大致可以分为两类,一类是值类型,一类是引用类型。值类型:整型、布尔型、字符型、实数型、结构型、枚举型。 引用类型:类、对象、字符串、数组、接口、委托。
高级编程第一章:体系结构 相关知识点小说的相关知识点
概念:值类型直接存储其值,值类型存储在堆栈上,而引用类型储存在托管的堆上。值类型被分配在栈上,它的变量直接包含变量的实例,使用效率比较高
值类型:值类型变量中保存的是实际数据,在赋值的时候只是把数据复制一份,然后赋给另一个变量。
例:
int strNumberA = 100; int strNumberB = strNumberA;//编译器会先复制strNumberA的值,后赋给strNumberB,会在内存的两个地方储存值100

引用类型:引用类型变量中保存的是“指向实际数据的引用指针”。在进行赋值操作的时候,它和值类型一样,也是先有一个复制的操作,不过它复制的不是实际的数据,而是引用(真实数据的内存地址)
例:
static void Main(string[] args) { MyVector vA = new MyVector(); MyVector vB = vA;//引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址 vA.Value = 100; Console.WriteLine(vA.Value + " 等于 " + vB.Value);//由于vA和vB指向同一内存地址,所以vB.Value的值也为100 vB.Value = 200; Console.WriteLine(vA.Value + " 等于 " + vB.Value);//同理vA.Value =vB.Value } private class MyVector { public int Value { get; set; } }

2.class与struct问题
概念:class和struct的语法基本相同,从声明到使用,都很相似。但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。
效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
关系:struct既不能继承也不能被继承,但是可以实现接口,而Class就可以完全扩展了。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。
代码:
static void Main(string[] args) { int strNumberA = 100; int strNumberB = strNumberA;//编译器会先复制strNumberA的值,后赋给strNumberB,会在内存的两个地方储存值100 MyVector vA = new MyVector(); MyVector vB = vA;//引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址 vA.Value = 100; Console.WriteLine(vA.Value + " 等于 " + vB.Value);//由于vA和vB指向同一内存地址,所以vB.Value的值也为100 vB.Value = 200; Console.WriteLine(vA.Value + " 等于 " + vB.Value);//同理vA.Value =vB.Value MyStruct structA = new MyStruct(); MyStruct structB = structA; //结构是值类型 赋值操作完成后,两个结构中的结构信息一致。注意是“结构中的信息”一致。 structA.Value = 100; structB.Value = 200; Console.WriteLine(structA.Value + " 不等于 " + structB.Value);//同理vA.Value !=vB.Value Console.Read(); } private class MyVector { public int Value { get; set; } } private struct MyStruct { public int Value; }

例子可以看出,值类型变量的赋值操作,仅仅是2个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变。
结构体引出的问题:上面说到值类型的内存不由垃圾回收控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,有垃圾回收机制控制。这就引出了关于.NET内存中的堆和栈的讨论 。李建忠老师发了一条关于Class性能好还是Struct性能好(换言堆性能好?还是栈性能好?)的话题微博 ,具体http://www.cnblogs.com/zoupeiyang/archive/2011/07/20/2112163.html,这里不讨论了。那么什么时机该用呢 ,比较struct和class的不同,以下是我的个人理解,
(1.在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
(2 在表示数据量大、逻辑复杂的大对象时,首选class。
(3 在表现抽象和多级别的对象层次时,class是最佳选择
3 . String 的一些问题
String与引用类型
例:
string str1 = "abc"; string str2 = str1; str1 = "123"; Console.WriteLine(str2);
输出结果是abc,改变str1的值对str2没有影响
这样的结果会使我们误以为string就是值类型。其实不然,示例1中str1 = "123"语句编译器私底下创建了一个新的字符串对象来保存新的字符序列"123",也就是此str1已非彼str1了,“此”str1的值的改变也就不能影响“彼”str1的值了,当然str2的值也就不会改变了。实质上str1 = "123"是str1=new string("123")的简写,它的每一次赋值都会抛掉原来的对象而生成一个新的字符串对象,分配新的内存空间,因此string是不可改变的。如果要创建可修改的字符串,可使用stringbuilder以获得更好的性能。
String 与 null问题
值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址。对值为null的引用类型的任何操作,都会抛出NullReferenceException异常
String与 StringBuilder 问题
MSDN解释 :String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。 String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。 因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联
个人理解:简单的说 StringBuilder 事先先分配内存,? 如果 StringBuilder 没有先定义长度 则 默认分配的长度为 16,当 StringBuilder 字符长度小于等于 16时,则StringBuilder 不重新分配内容,当 StringBuilder 字符长度大于16 小于 32的时候 ,StringBuilder 又重新分配 16的2倍 。依次类推, StringBuilder.Capacity可以获取 StringBuilder 的真是的分配的内存大小? StringBuilder.Lenght 是获取 StringBuilder 字符串的 长度
比如,拼凑SQl语句,这样的情况就用stringbuilder来提高效率
stringBuilder strSql=new stringbulider; strSql.append(" select * from Table "); strSql.append(" where 1=1"); strSql.append(" and 2=2"); return strSql.tostring();

>>简单了解中间语言
微软中间语言(Microsoft Intermediate Language),简称IL ,.Net平台上最终编译都会生成IL,运行受.net监控,因此IL属于托管代码,如同Win32要掌握汇编一样,.Net下则需要掌握IL。
Console.WriteLine("Hello,Just test it"); Console.ReadLine();

自带ildasm.exe 查看
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint // 代码大小 19 (0x13) .maxstack 8 IL_0000: nop IL_0001: ldstr "Hello,Just test it" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: call string [mscorlib]System.Console::ReadLine() IL_0011: pop IL_0012: ret } // end of method Program::Main
在IL的源文件扩展名.il ,简单了解下 ,在IL中入口方法不一定是Main,而用entrypoint表示,ldstr指令读入字符串 "Hello,Just test it",Call则是调用系统方法WriteLine 将字符串输出到屏幕,再调用ReadLine是程序暂停,最后ret返回指令。(注:IL中的空指令Nop ,其十六进制编码00h,而win32 Asm 中为90h),先了解这么多,有机会看能否写篇.Net 扩展的PE结构。
注:.Net常用反汇编工具:ildasm ,Reflector,XenocodeFox ,ILSpy等 (IL文件可以在SDK命令行进行重编译 ,指令 ilasm XXX.il)

应用程序域
应用程序域是.Net中用于减少运行应用程序的系统开,在运行一个进程环境内运行,Windows通过地址空间把进程分割开来,这样每个进程有4GB的虚拟内存(32位系统)来存储数据和可执行代码,Windows利用额外的方式把这些虚拟内存映射到物理内存或磁盘空间的一块区域上,这样每个进程都会有不同的映射
高级编程第一章:体系结构 相关知识点小说的相关知识点
一般的情况下,任何进程只能通过指定的虚拟内存中的一个地址来访问内存,即进程不能访问内存,因此一个进程不不能访问分配给另一个进程的内存,这样就确保了任何执行错的代码不会影响到其他地址空间以外的数据,Window的保护模式的一些知识
扩展:再简单提下关于Window的保护模式的一些知识,在保护模式下程序可以利用更多的内存,实现多任务系统,Win32平台内存模式每个进程都拥有赋予自己的虚拟空间每个地址为4GB(32位),32位指针可以拥有00000000h到 FFFFFFFFh之间的任何值,程序的代码与数据不必放在同一地址空间上,即不必区分代码段与数据段,也不必要了解CS,DS,ES等寄存器的几天内容,虚拟内存不是真正的内存,它通过映射的方法,是可以用的虚拟地址达到4GB,每个应用程序分配2GB内存,剩下的2GB 留给系统用,window是一个多任务的系统,Cpu运行时间某一时刻,和这个程序无关的东西不会映射到线程地址中,因此每个程序都有自己的4GB空间地址。
小结
结束了,纠结这点浅薄的知识该不该上首页,毕竟是第一次在园里写博文,水平也很逊色 ,好吧,我首页只上这系列的第一篇文章,老鸟勿喷。 以上就是我的一些浅薄认识,个人水平有限,难免有不足之处,如有错误的地方,欢迎批评指正!


Tags:  初中数学知识点 初三数学知识点 高中数学知识点 初二数学知识点

延伸阅读

最新评论

发表评论