上一页 1 ··· 4 5 6 7 8 9 10 11 下一页
摘要: 1. 类型对象 首先看如下代码: class Program { static void Main(string[] args) { List<object> objs = new List<string>(); Console.ReadKey(); } }以上代码在C#编译器中会报错,错误是类型不匹配... 阅读全文
posted @ 2012-12-24 16:24 self.refactoring 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 1. 初识泛型泛型是指在定义一个类型的时候,不用将该类型所操作的对象的类型确定,而是交给调用者来确定。该类型的实现只是实现一些通用的行为。例如:public class Util<T>{ public void PrintContent(T content) { Console.WriteLine(content.ToString()); }}代码定义了一个泛型类,其中"T"是该泛型类的类型参数.用它来代表将来可能要操作的对象的类型。而在该类型的实现中,我们可以赋予一些通用的行为。比如此处的PrintContent.这种定义了类型... 阅读全文
posted @ 2012-12-20 15:16 self.refactoring 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 其实操作符重载没怎么用过,之前还觉得是个很神秘的东西。CLR本身是没有操作符这一说的,操作符经过编译器编译后会生成对某个方法的调用。(某些基元类型除外,比如两个int型相加,编译器会直接生成add指令。)而我们对操作符的重载,则会被编译器编译成类型的一个方法。举例说明:public class Man{ public string Name { get; set; } public int Age { get; set; }}public class Women{ public string Name { get; set; } publ... 阅读全文
posted @ 2012-12-04 15:55 self.refactoring 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 在读这一节的类容之前,我觉得构造函数我都用了至少几千上万遍了,还会有什么新鲜的东西吗?经过仔细的阅读这一节,发现这样一个小小的主题,我不知道的并且对我们写程序至关重要的原来还有这么多... 1. 并不是所有新对象的创建都需要用到构造函数 Object类型定义了一个实例方法:MemberwiseClone,该方法的功能是为新对象分配内存,然后将当前实例进行浅拷贝到新的内存块中。这个过程便不会调用构造函数。 2. 便捷的内联成员初始化 首先贴一段我写了无数遍的代码:classPerson{privatestring_name="Jensen";privateint_age=26 阅读全文
posted @ 2012-12-02 21:01 self.refactoring 阅读(383) 评论(0) 推荐(0) 编辑
摘要: 个人认为两者都可以认为是常量,但是却又是有区别的。首先看看两者所支持的类型:const 只支持基元类型(所谓基元类型是指编译器直接支持的类型,也就是像int,char,string等等在C#编译器中定义了关键字的类型)。readonly 可以支持所有类型。然后再看看两者所限定常量的本质:const 限定的是变量的引用以及变量所代表的值。readonly仅仅限定的是变量的引用。(如果是引用类型的话,变量所代表的值是能够改变的)最后看看编译器对这两者进行的处理:const当编译器遇到一个对const对象的引用时,编译器会将const变量所代表的值直接嵌入生成的IL代码中,也就是说编译完后这段代码. 阅读全文
posted @ 2012-11-30 15:35 self.refactoring 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 今天和同事在讨论一个CLR的问题,题目如下:classProgram{staticvoidMain(string[]args){Bb=newB();Console.ReadKey();}publicclassA{publicstaticvoidPrint(){Console.WriteLine("A");}publicA(){Print();}}publicclassB:A{publicstaticvoidPrint(){Console.WriteLine("B");}publicB(){Print();}}View Code classProgram{ 阅读全文
posted @ 2012-11-22 17:29 self.refactoring 阅读(276) 评论(1) 推荐(0) 编辑
摘要: 平台确定 通过第一节,我们知道:编译器在PE文件中写入了大量的元数据。其中在PE32(+)中有一个machine字段用来标识该程序集所面向的平台(一般应该是x86,x64,不确定(Any CPU)). 在当前运行平台与程序集面向平台兼容的情况下,程序集为以所指定的平台类型运行(比如:面向x86则分配32从位地址空间,为其加载x86版本的所引用系统程序集;面向x64则为其分配64位的地址空间,为其加载x64版本的所引用系统程序集;如果any cpu则根据当前运行平台确定。) 实例解剖CLR运行模型 以如下代码为例: classProgram {... 阅读全文
posted @ 2012-11-20 22:45 self.refactoring 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 说到.NET基础,我觉得应该首先应该要知道一组概念,我觉得作为.NET程序员,这应该算是常识。有可能我目前的理解也不算正确,希望能在以后的积累中逐步完善。CLR- CLR (Common Language Runtime)它为.NET Application提供一个运行时的环境。毕竟.NET程序和普通的Windows应用程序(比如说用C++开发的程序)运行方式是不一样的。在运行时,它有自己的内存管理机制,有自己的执行模型,有自己的异常处理,有自己的线程同步等。而这些都是由CLR提供。相当于一个容器。CTS- CTS (Common Type System) .Net是一个基于类型的平台,所有. 阅读全文
posted @ 2012-11-20 13:24 self.refactoring 阅读(504) 评论(0) 推荐(0) 编辑
摘要: C++中有函数指针,而C#中与之对应的便是委托。那在PInvoke的过程中传入回调函数的方法应该是传入委托。PInvoke会将委托封送为函数指针传递到C++中。Sample:C++代码:typedefchar*(*__cdeclAddCallBack)(constchar*a,constchar*b);_declspec(dllexport)void_cdeclCallBackDelegate(AddCallBackcallback){char*result=0;if(callback)result=callback("Mynameis","Jensen" 阅读全文
posted @ 2012-11-18 14:10 self.refactoring 阅读(1434) 评论(0) 推荐(0) 编辑
摘要: IntPtr是托管环境中用来描述非托管环境中指针的类型。其所占内存大小由运行时的系统环境所决定(其实是因为在不同的系统环境中指针所占的字节数不一样,32位系统为4个字,64位系统为8个字节)。个人认为IntPtr主要有两种用途: 作为不透明指针这种情况下托管环境中不需要了解该指针的意义,仅仅保存在内存中,在需要时传送给非托管环境。举个例子:假设我们用C++实现了一个Http服务器,然而我们需要为提供C#接口启动和停止服务。C++代码:classHttpService{private:int_port;public:HttpService(){}voidstart(intport){_po... 阅读全文
posted @ 2012-11-17 22:06 self.refactoring 阅读(2237) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 下一页