冠冕堂皇

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

文章分类 -  .net基础

摘要:帮同学写个播放音乐的代码,用的是vs2005,本来调用下API中的mciSendSrring()就很容易解决,后发现老是有warning:incompatible types - from 'char [49]' to 'LPCWSTR'当时也就认为是warning,没太在意。运行后发现 无法播放,连错误信息都是乱码。后查阅LPCWSTR 为何物,看到UNICODE 与ANSI字符集,不解,进而,查阅UNICODE与ANSI相关信息,终于发现了问题,原来是字符集的错误导致程序的乱码!vs2005默认是UNICODE 编码,vc是ANSI编码!以下转载UNICOD 阅读全文
posted @ 2013-10-29 22:30 冠冕堂皇 阅读(148) 评论(0) 推荐(0)

摘要:解析:CLR支持两种类型:值类型和引用类型。用Jeffrey Richter(《CLR via C#》作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”。这就要求我们正确理解和使用值类型和引用类型。值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。值类型的实例 阅读全文
posted @ 2013-10-29 00:55 冠冕堂皇 阅读(130) 评论(0) 推荐(0)

摘要:JIT(JustIn Time),这是我们通过.net编译器生成的应用程序最终面向机器的编译器,因此大家对JIT了解一下其工作原理还是很有必要的。最近研究了一下,参考了很多文章,也在msdn上查了些资料,以下是最近我对JIT的理解和总结。大家都知道CLR只执行本机的机器代码。目前有两种方式产生本机的机器代码:实时编译(JIT)和预编译方式(产生native image)。下面,我想分析一下JIT。当我们需要校调对性能要求很高的代码时,查看IL通常不是最好的做法,因为JIT优化器会默默的优化我们的代码,使用reflector或者ildasm你能很快发现release和debug模式下产生的IL代 阅读全文
posted @ 2013-10-29 00:54 冠冕堂皇 阅读(393) 评论(0) 推荐(0)

摘要:我们都知道,c#的两大数据类型分别为值类型和引用类型。很多人或许闭着眼睛都能说出值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等,但是当被问及到二者之间的联系和区别,什么时候用struct什么时候用class时,就常常混淆不清了。为此,了解值类型和引用类型的本质差异就变的很有必要了。值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放, 阅读全文
posted @ 2013-10-29 00:48 冠冕堂皇 阅读(256) 评论(0) 推荐(0)

摘要:CLR在.NET中的作用是十分重要的,如果要完全掌握.NET那么理解CLR运行原理就是必然的事情。比如,你想在程序中实现动态获取程序集信息,动态创建,后期绑定,反射等特性,那么正确的理解CLR的原理就显得格外的重要。一:本机无关的代码-----MSIL(中间语言) 平台无关本机代码, MSIL使用.NET支持的语言所编写的代码,JIT 编译. MSIL(Microsoft Intermediate Language)微软的中间语言和JAVA的虚拟机类似,是与CPU无关的指令集。当编译为托管代码时,编译器将源代码翻译为MSIL,MSIL 包括用于加载、存储和初始化对象以及对对象调用方... 阅读全文
posted @ 2013-10-29 00:25 冠冕堂皇 阅读(699) 评论(0) 推荐(0)

摘要:我们先看下面一段程序:1.///2.///父类3. ///作者:周公4. ///首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx5. ///日期:2008-09-016.///7.publicclassFather8.{9.publicvoidRun0()10.{11.Console.WriteLine("Father.Run0");12.}13.}14.15.///16. ///子类17. ///作者:周公18. ///首发地址:http://blog.csdn.net/zhoufoxc 阅读全文
posted @ 2013-10-29 00:18 冠冕堂皇 阅读(122) 评论(0) 推荐(0)

摘要:最近一直在看>阅读到了装箱和拆箱的章节,想弄清楚到底什么是装箱和拆箱,装箱和拆箱如何再程序中高效的运用.于是就搜集了很多资料,并把其中一些认为比较好的以及自己的看法贴出来大家共享.由于本人C#能力有限,如果文中有任何不正确的地方,忘前辈们指正. 我们将通过实际的例子以及ILDASM.exe工具去查看装箱和拆箱的过程(至于ILDASM.EXE的用法请查看MicroSoft的帮助). 一::我们想看下装箱和拆箱的对象 装箱:值类型=>引用类型. 拆箱:引用类型=>值类型 所以我们看到再整个装箱和拆箱的过程中设计到两种类型.值类型(原类型(Sbyte、Byte、Short、Usho 阅读全文
posted @ 2013-10-29 00:12 冠冕堂皇 阅读(178) 评论(0) 推荐(0)

摘要:装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用类型中架起一做桥梁.换言之,可以轻松的实现值类型与引用类型的互相转换,装箱和拆箱能够统一考察系统,任何类型的值最终都可以按照对象进行处理.C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型得时候都在堆(HEAP)中分配内存,会造成极低的效率!(个中原因以及关于堆和栈得区别会在另一篇里单独得说说!).NET如何解决这个问题得了?正 阅读全文
posted @ 2013-10-29 00:00 冠冕堂皇 阅读(158) 评论(0) 推荐(0)

摘要:1. Stack和Heap 每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况。值类型变量(函数的参数、局部变量 等非成员变量)都分配在stack中,引用类型的对象分配在heap中,在stack中保存heap对象的引用指针。GC只负责heap对象的释 放,heap内存空间管理Heap内存分配 除去pinned object等影响,heap中的内存分配很简单,一个指针记录heap中分配的起始地址,根据对象大小连续的分配内存Stack结构 每个函数调用时,逻辑上在thread stack中会产生一个帧(stack frame),函数返回时 阅读全文
posted @ 2013-10-28 23:53 冠冕堂皇 阅读(120) 评论(0) 推荐(0)

摘要:今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个《WCF分布式开发必备知识》系列后的一次休息吧。以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会问相关的问题。那么你是否也遇到这样的问题呢?比如你清楚.Net的垃圾回收机制吗?你能简述一下GC的工作原理吗?怎么样才能有效的管理内存呢?Using语句体内实例化的对象有什么作用?等等相关问题。下面我们就来详细讨论一下。相信你看完以后也可以面试别人。 本章的内容如下, 1..Net的类型和内存分配 2.GC垃圾收集器的工作原理 3.什么是非托管资源 4.如何有效释放对象资源。 1..Net的类型和内存... 阅读全文
posted @ 2013-10-28 23:48 冠冕堂皇 阅读(155) 评论(0) 推荐(0)

摘要:一、封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。 封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。私有的数据可以用两种方式来间接的控制。第一种方法,我们使用传统的存、取方法。第... 阅读全文
posted @ 2013-10-28 23:47 冠冕堂皇 阅读(128) 评论(0) 推荐(0)

摘要:网上看到的两篇关于堆与栈的介绍,讲的比较清楚。1堆和栈的区别原地址:http://blog.csdn.net/goingup/archive/2006/03/07/618309.aspx在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中 阅读全文
posted @ 2013-10-28 23:46 冠冕堂皇 阅读(130) 评论(0) 推荐(0)