
c#
zhaixh_89
这个作者很懒,什么都没留下…
展开
-
Win32结构化异常处理
SEH(Structured Exception Handling)是windows系统提供的异常处理机制。这种机制独立于编程语言。通常情况下,开发人员不需要直接调用Win32中原始的与SEH相关的API函数,而是通过特定语言的类库(比如MFC)间接地使用SEH,特定语言的编译器会把他们转换为windows操作系统中相关API函数的调用。SEH的思想:当某个线程在执行过程中出现异常时,它回调一...原创 2020-04-11 11:45:52 · 422 阅读 · 0 评论 -
对象销毁理解
当.NET程序运行时,CLR负责监控所有应用程序所创建的所有对象,当发现对象不再使用时,就回销毁对象,并回收其资源。这就是CLR的垃圾收集机制,基于此,.NET程序员再不用管理内存分配与回收,极大地简化了.NET应用程序的开发。但是有时我们也需要考虑对象销毁的问题,比如程序中我们使用了非托管资源,如文件句柄、用于线程同步的Mutex对象。这些资源应遵循“需要即创建用完即销毁”的原则。与c+...原创 2020-03-21 11:06:24 · 433 阅读 · 0 评论 -
CLR如何捕获并处理异常
对于任何一个.NET应用程序中的类,其所包含的方法都有一个异常处理表,如果此方法中没有try...catch...finally语句,则异常处理表为空。(即此方法生成的IL指令中不包括任何的异常处理子句)根据之前的学习我们知道,当应用程序拥有多层嵌套的异常捕获结构时,如果最底层发生了异常,CLR将优先在引发异常的那一层去搜索catch语句块,看看有没有“兼容”此类型异常的处理代码,如果没有,跳...原创 2020-03-15 13:37:11 · 801 阅读 · 0 评论 -
类和对象的CLR内存布局
c#中有许多的内置类型,int是最常用的数据类型之一。它代表一个4个字节的有符号整数。对于下面的这代码却可以通过c#编译器的语法检查。int i = int.Parse("123");string num = 100.ToString();生成的IL指令如下:仔细查看可发现call指令调用的是System.Int32的方法。为什么一个四字节的int型整数会与一个复杂的Sy...原创 2020-03-13 15:22:43 · 1003 阅读 · 0 评论 -
CLR虚方法调用原理
我们知道CLR会为每个类型创建一个”方法表“。方法表的详细布局方式微软没有公开发布,因此只能依据自己的理解给出一个大致的方法表, 并不一定符合CLR实情。 类型方法表的前面是一些CLR用于管理类型的控制信息,紧接着是一个表明此类型的方法总数的表项(即图中的方法槽个数),类型用的方法被分为几部分依次排列,一般来说,虚方法都集中在表的前部,因为这些方法可能会以多态方式被调用。表的中部是类...原创 2020-03-12 19:03:17 · 691 阅读 · 0 评论 -
String字符串总结
String类型的变量代表一个字符串,属于.Net应用程序中最常用的类型之一,然后它包含着很对容易被人忽略的地方。首先String不是值类型,它属于引用类型,由于String变量定义不适用new,因此很对人认为它是值类型变量,但是它实际上属于引用类型,然而因它拥有一些不同于一般引用类型的特性,因此我们将String看成一个特殊的引用类型。String变量内容是只读的string s1...原创 2020-03-12 15:19:40 · 407 阅读 · 0 评论 -
值类型与引用类型变量探究
.Net将变量的类型分为引用类型和值类型两大类。使用int、double等数值类型所定义的变量属于值类型,除此之外,枚举类型和结构也属于值类型。类类型的变量属于引用类型,他们可以引用一个真实的对象。.Net中的引用类型分为:类类型、接口类型、数组类型和委托类型。值类型变量与引用类型变量的内存分配模型是不一样的,为此先区分下两种不同类型的内存区域:线程堆栈和托管堆线程堆栈和托管堆每个...原创 2020-03-12 13:50:17 · 205 阅读 · 0 评论 -
多态编程的CLR探索
我们知道在定义类字段的时候可以对其初始化,如果子类和父类都有多个字段需要初始化,那么初始化的顺序如何呢?实例化字段测试代码如下:class A{ public int m = 5;}class B : A{ public int n = 8; public B(int v) { n = v; }}static v...原创 2020-03-12 12:51:15 · 206 阅读 · 0 评论 -
c#扩展方法的理解
扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中。扩展方法所在的类也必须被声明为staticC#只支持扩展方法,不支持扩展属性、扩展事件等。扩展方法的第一个参数是要扩展的类型,放在this关键字的后面,告诉编译期这个方法是Money类型的一部分。在扩展方法中,可以访问扩展类型的所有公共方法和属性。“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生...转载 2019-09-18 20:43:20 · 276 阅读 · 0 评论 -
C#装箱和拆箱(Boxing 和 UnBoxing)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...转载 2019-09-18 15:20:00 · 211 阅读 · 0 评论 -
观察者模式(基于CSharpMessenger扩展)
在使用c#中的事件时,经同事推荐看到了这个框架,它是c#消息传递的高级版本,代码不多,拜读之后对代码结构进行了重构,感觉更清晰点/* * Advanced C# messenger by Ilya Suzdalnitski. V1.0 * * Based on Rod Hyde's "CSharpMessenger" and Magnus Wolffelt's "CSharpMess...原创 2018-12-04 15:01:13 · 359 阅读 · 0 评论 -
单例模式的几种实现
单例模式是开发人员在开发中比较常用的一种设计模式,实现方式也很简单,大致原理:在我们程序开发中始终保持一个类的唯一单例,因此我们必须严格控制它的实例创建,一般的设计方式会在类中定义一个私有的成员变量instance以及一个静态的共有方法getinstance(),他负责检测和实例化自己并存储在成员变量中1、单实现方式如下public sealed class Singleton //...翻译 2018-11-20 11:34:35 · 214 阅读 · 0 评论 -
xLua使用教程
Lua文件加载一、执行字符串最基本是直接用LuaEnv.DoString执行一个字符串,当然,字符串得符合Lua语法比如:luaenv.DoString("print('hello world')")完整代码见XLua\Tutorial\LoadLuaScript\ByString目录但这种方式并不建议,更建议下面介绍这种方法。二、加载Lua文件用lua的requir...原创 2018-10-10 14:45:08 · 5488 阅读 · 0 评论 -
c# Lambda表达式
c#中Lambda表达式可以理解为一个匿名函数,他可以像普通函数一样包含表达式和语句,可用于创建 委托或 表达式目录树类型的 匿名函数,通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。另外Lambda 表达式对于编写 LINQ 查询表达式特别有用。若要创建 Lambda 表达式,需要在 Lambda 运算符 =>左侧指定输入参数(如果有),然后在另一...原创 2018-10-18 19:48:36 · 282 阅读 · 0 评论