随笔分类 -  .NET CLR

.NET CLR随笔
摘要:在async和await之前我们用Task来实现异步任务是这样做的: 而使用async和await后的异步任务是这样写的: string result = await GetBaiduHtmlAsync(); Console.WriteLine(result); 其实不仅仅是写法变了,而是执行原理, 阅读全文
posted @ 2018-02-06 10:49 self.refactoring 阅读(784) 评论(0) 推荐(1) 编辑
摘要:信号量与互斥体 互斥体(Mutex)是操作系统中一种独占访问共享资源的机制。它像一把所锁,哪个线程获取到互斥体的控制权,则可以访问共享的资源,或者执行处于受保护的代码。而其他的线程如果也想获取控制权,则需要要阻塞等待,知道拥有控制权的线程释放控制权。 信号量(Semaphore)是操作系统中协调多个 阅读全文
posted @ 2017-12-12 22:36 self.refactoring 阅读(243) 评论(0) 推荐(0) 编辑
摘要:class Program { static void Main(string[] args) { string[] arr = { "趙(ZHAO)", "錢(QIAN)", "孫(SUN)", "李(LI)", "周(ZHOU)", "吳(... 阅读全文
posted @ 2014-05-14 17:23 self.refactoring 阅读(613) 评论(0) 推荐(0) 编辑
摘要:非null值表示和C#的用法一样。Nullable a = 1;null值的表示:Nullable a = Nullable(); 阅读全文
posted @ 2014-01-21 22:29 self.refactoring 阅读(510) 评论(0) 推荐(0) 编辑
摘要:System.Timer.Timer 根据命名空间看这个类貌似才是标准的Timer,它提供Interval属性和Elapsed事件。可以每隔一个时间周期触发一次Elapsed事件。在ThreadPool的线程中回调事件处理函数。 该类也提供对UI线程的支持,可能通过将UI元素设置为SynchronizingObject属性(ISynchronizeInvoke类型,因此只能支持WinForm)... 阅读全文
posted @ 2013-12-10 22:50 self.refactoring 阅读(647) 评论(0) 推荐(0) 编辑
摘要:自从开始系统学习CLR via C#以来,看到CLR的什么功能总想深入了解内部是如何实现的。研究枚举时也不例外。首先看一下枚举的庐山真面目:定义一个如下的枚举:public enum Colors:ushort{ Red, Blue, Green}注意:此处的:ushort并不是描述一个继承关系。它是用来描述该枚举所采用的基础类型为ushort. 让我们再来看一下编译器生成的代码:其实经过编译器处理之后,这个枚举变成了一个继承自System.Enum的类。我们定义的每一个枚举元素变成了这个类中的一个公有,静态的常量。而它们的类型则是之前通过:ushor... 阅读全文
posted @ 2013-01-18 17:23 self.refactoring 阅读(308) 评论(0) 推荐(0) 编辑
摘要:字符串这个东西我想所有人从接触程序开始应该就开始了解。但是在CLR中,仍然有一些东西我了解得并不清楚。 字符串的留用 我们经常在代码中定义一些常量字符串,有时候在多个地方定义的常量字符串是一样的。或者在我们的程序中定义了很多的string对象,这些对象里保存的字符串值都是一样的。 在CLR中String对象是不可变的,那么如果内存中有大量的值相同的String对象,是对内存的一种浪费。 其... 阅读全文
posted @ 2013-01-18 11:00 self.refactoring 阅读(537) 评论(0) 推荐(0) 编辑
摘要:接口就是将一些相关联的动作集合在一起形成一个契约,然后让类可以去实现这些契约。接口中定义的都是动作(方法相关:比如属性,方法,事件)的签名,没有实现接口中定义的成员都是Public的(因为是对外公布的契约)接口的名字一般用I开头,以标识其为接口 而对于实现了特定接口的类必须实现接口中定义的所有动作 内存模型看一下当类实现了一个接口时,CLR内部的内存布局是怎么样的。以如下实例为例:在运行时,CLR中会生成如下数据结构:调用模型这样子的话如果我作如下调用:MessageHandler messageHandler = new MessageHandler();messageHandler.Di. 阅读全文
posted @ 2013-01-11 16:29 self.refactoring 阅读(235) 评论(0) 推荐(0) 编辑
摘要: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 阅读(363) 评论(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 阅读(375) 评论(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 阅读(330) 评论(0) 推荐(0) 编辑
摘要:在读这一节的类容之前,我觉得构造函数我都用了至少几千上万遍了,还会有什么新鲜的东西吗?经过仔细的阅读这一节,发现这样一个小小的主题,我不知道的并且对我们写程序至关重要的原来还有这么多... 1. 并不是所有新对象的创建都需要用到构造函数 Object类型定义了一个实例方法:MemberwiseClone,该方法的功能是为新对象分配内存,然后将当前实例进行浅拷贝到新的内存块中。这个过程便不会调用构造函数。 2. 便捷的内联成员初始化 首先贴一段我写了无数遍的代码:classPerson{privatestring_name="Jensen";privateint_age=26 阅读全文
posted @ 2012-12-02 21:01 self.refactoring 阅读(385) 评论(0) 推荐(0) 编辑
摘要:个人认为两者都可以认为是常量,但是却又是有区别的。首先看看两者所支持的类型:const 只支持基元类型(所谓基元类型是指编译器直接支持的类型,也就是像int,char,string等等在C#编译器中定义了关键字的类型)。readonly 可以支持所有类型。然后再看看两者所限定常量的本质:const 限定的是变量的引用以及变量所代表的值。readonly仅仅限定的是变量的引用。(如果是引用类型的话,变量所代表的值是能够改变的)最后看看编译器对这两者进行的处理:const当编译器遇到一个对const对象的引用时,编译器会将const变量所代表的值直接嵌入生成的IL代码中,也就是说编译完后这段代码. 阅读全文
posted @ 2012-11-30 15:35 self.refactoring 阅读(199) 评论(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 阅读(279) 评论(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 阅读(312) 评论(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 阅读(511) 评论(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 阅读(1440) 评论(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 阅读(2262) 评论(0) 推荐(0) 编辑
摘要:其实从理论上讲结构体的和一般的基本值数据类型的封送没有太大的区别,因为都是栈上内存块的处理(当然如果结构体内有引用类型的成员也需要处理堆上的内存块)。Example:(最基本的结构体封送)C++ Code:structPerson{public:LPCSTRname;intage;};_declspec(dllexport)void_stdcallPrintPerson(Personperson){setlocale(LC_ALL,"chs");wprintf(L"PersonName:%s,Age:%d",person.name,person.age) 阅读全文
posted @ 2012-11-11 15:53 self.refactoring 阅读(1140) 评论(0) 推荐(0) 编辑
摘要:如果是写过C++的肯定一提到字符就会想到字符编码(Multibyte或Unicode)。写.NET程序的便不会考虑这个,因为在CLR环境中默认会采用Unicode编码。(其实刚毕业的时候写了很久的.NET程序却完全不知道编码这回事,因为在.NET环境中好像不知道编码技术也不会对开发有什么影响。因此个人感觉出于对计算机科学系统学习,最好还是从非托管环境开始学习程序设计)。那在调用非托管的方法时,如何解决编码问题呢?答案是要用到DllImportAttribute的CharSet属性。根据MSDN对CharSet的说明如下:CharSet可能有:Ansi调用时将字符参数封送为Ansi编码的字符Un 阅读全文
posted @ 2012-11-06 17:33 self.refactoring 阅读(566) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示