首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《CLR via C#》笔记:第4部分 核心机制(3)

CLR的AppDomain功能解决了所有这些问题。AppDomain 允许第三方的、不受信任的代码在现有的进程中运行,而CLR保证数据结构、代码和安全上下文不被滥用或破坏。...程序员经常将寄宿和AppDomain与程序集的加载和反射一起使用。 CLR寄宿 .NET Framework在 Windows平台的顶部运行。...然后,CLR查找栈上在同一个AppDomain中的任何 catch 块。有一个catch 块能处理异常,则异常处理完成,将继续正常执行。...宿主不能基于一些具体的加载项来构建和测试,因为加载项由不同公司创建,而且极有可能是在宿主应用程序发布之后才创建的。这是宿主为什么要在运行时发现加载项的原因。...派生类型)之外的所有类型创建对象。

84510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# new关键字和对象类型转换(双括号、is操作符、as操作符)

    一、new关键字 CLR要求所有的对象都通过new来创建,代码如下: Object obj=new Object(); 以下是new操作符做的事情 1、计算类型及其所有基类型(一直到System.Object...CLR利用这些成员管理对象.额外成员的字节数要计入对象的大小. 2、从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0 3、初始化对象的"类型对象指针"和"同步索引块"成员 4、...二、对象类型转换 1、基础知识 CLR最重要的特性之一就是类型安全.在运行时,CLR总能知道当前对象是什么类型,调用GetType方法即可知道当前对象是什么类型,由于GetTpye是非虚方法,所以一个类型不能伪装成另一个类型...是否兼容于Person类型,如果是,在if语句内部转型时,CLR再次核实stu是否引用一个Person类型,CLR的类型检查增强了安全性,但无疑会对性能造成一定的影响,应为CLR首先必须去判断变量引用的实际类型...as操作符的做法是检查转型结果是否为null,如果直接使用这个结果可能会抛出System.NullReferenceException异常,代码如下: public class Program

    1K90

    解析C#类中的构造函数

    构造函数设计的定义:    构造器是允许将类型的实例初始化为良好状态的一种特殊方法。 2.   ...(2).希望类仅通过调用某个静态成员函数来实例化(对象实例化工厂方法)   4.基类构造函数的使用:   编译器在调用基类的构造器前,会初始化任何使用了简化语法的字段,以维持源代码给人留下的...为了使代码“可验证”,类的实例构造器在访问从基类集成的任何字段之前,必须先调用基类的构造器。如果派生类的构造器没有显示调用一个基类构造器,C#编译器会自动生成对默认的基类构造器的调用。 2.   ...【C#不允许值类型(结构)定义无参数的构造器,但是CLR允许。C#运行值类型(结构)定义有参数的构造器】 三. ...3. .JIT对调用的位置选择: “字段初始化前”语义是首选的,因为它使CLR能够自由选择调用类型构造器的时机,而CLR会尽可能地利用这一点来生成运行得更快的代码。

    3.4K50

    C++:29 --- C++继承关系下的内存布局(下)

    正如后文讨论强制转化和成员函数时指出的,这个偏移量会造成少量的调用开销。 具体的编译器实现可以自由地选择内嵌基类和派生类的布局。...(在G中,虚基类对象C的地址与G的“虚基类表指针”之间的偏移量 ( 当对于所有的派生类来说偏移量不变时,省略“d”前的前缀))。比如,在32位平台上,GdGvptrC是8个字节。...先根据P和R在S中的偏移,调整this为P*,也就是S*,然后跳转到相应的虚函数处执行。 在微软VC++实现中,对于有虚函数的多重继承,只有当派生类虚函数覆盖了多个基类的虚函数时,才使用调整块。...6 调整块 正如已经描述的,有时需要调整块来调整this指针的值(this指针通常位于栈上返回地址之下,或者在寄存器中),在this指针上加或减去一个常量偏移,再调用虚函数。...每当虚函数被调用时,该偏移数据(通常为0),被加到对象的地址上,然后对象的地址再作为this指针传入。

    1.3K20

    C#面向对象实现原理:深入理解封装、继承和多态

    这样,我们可以使用Animal类型的变量来引用Dog或Cat对象,调用Speak方法时,会根据实际的对象类型来执行相应的方法。这就是多态的体现。...当你创建一个派生类,并在其中重写一个虚方法时,CLR会为这个派生类创建一个新的方法表。这个方法表中,重写的虚方法的地址会被替换为派生类中的版本。...当你创建一个派生类,并在其中实现一个抽象方法时,CLR会为这个派生类创建一个新的方法表。这个方法表中,抽象方法的地址会被替换为派生类中的版本。...当你通过抽象类的引用调用这个抽象方法时,CLR会根据实际的对象类型找到正确的方法表,然后在方法表中查找这个抽象方法的地址,然后跳转到这个地址执行方法。...这个指针的创建和初始化是在对象创建的过程中完成的。具体来说,当你使用new关键字创建一个对象时,CLR会执行以下步骤:内存分配:CLR首先会在堆上为新对象分配内存。对象的大小取决于其字段的数量和类型。

    28410

    C++:28 --- C++内存布局(上)

    由于C++基于C,所以C++也“基本上”兼容C。特别地,C++规范在“结构”上使用了和C相同的,简单的内存布局原则:成员变量按其被声明的顺序排列,按具体实现所规定的对齐原则在内存地址上对齐。...VC++在虚基类表中增加了一些额外的项,这些项保存了从派生类到其各层虚基类的偏移量。 3 强制转化 如果没有虚基类的问题,将一个指针强制转化为另一个类型的指针代价并不高昂。...转化为E类型指针E*时,必须在指针上加一个非0的偏移常量dFE。C ++规范要求NULL指针在强制转化后依然为NULL ,因此在做强制转化需要的运算之前,VC++会检查指针是否为NULL。...也就是说,在普通函数调用的参数传递、调用、返回指令开销外,虚函数调用还需要额外的开销。 回头再看看P和Q的内存布局,可以发现,VC++编译器把隐藏的vfptr成员变量放在P和Q实例的开始处。...”,调用虚基类的析构函数(按照相反顺序) 在VC++中,有虚基类的类的构造函数接受一个隐藏的“最终派生类标志”,标示虚基类是否需要初始化。

    1.1K20

    C# 多线程六之Task(任务)二

    前面介绍了Task的由来,以及简单的使用,包括开启任务,处理任务的超时、异常、取消、以及如果获取任务的返回值,在回去返回值之后,立即唤起新的线程处理返回值、且如果前面的任务发生异常,唤起任务如果有效的处理异常等关于...如果任务没有完成,就调用Dispose方法,那么直接抛异常,如果完成了,它就释放了ManualResetEventSlim信号量(后面的文章会介绍).所以如果你在task中使用了其它的一些非托管资源,那么最好在代码里自己手动释放...,在使用完之后。...或者自己实现了Task的派生类,把需要用的非托管资源加进去,然后在使用完派生类之后,调用Dispose方法....Faulted = 7 } 构造完Task对象是,状态为Created,当任务启动时,状态变为WaitingToRun,当Task实际在线程上运行时,状态变为Running.如果当前任务为父任务

    1.2K40

    《CLR via C#》Part2之Chapter4 类型基础(二)

    但是将对象向它的某个派生类转换时,C#要求必须显示转换,因为这种转换可能在运行时报错。 类型伪装是去多安全漏洞的根源。...; } .csharpcode .lnum { color: #606060; } --> 在使用as的形式,如果o不兼容IsaacZhang类型,将返回一个Null;因为使用as操作符,CLR只会校验一次对象的类型...命名空间和程序集 在C#中我们使用using引入命名空间,但是CLR并不知道命名空间的任何事,访问一个类型时,CLR需要知道类型的完整名称(长的、包括句点符号的名称)以及该类型的定义具体在哪个程序集中。...默认情况下,C#编译器会自动在MSCorLib.dll程序集中查找“引用的类型”,即使你没有显式的告诉它。...一个线程创建时,会分配到一个1M大小的栈,这个栈的空间用于向方法传递参数。 M1方法开始执行时,在线程栈上分配局部变量name的内存,如下图: ?

    40430

    C# 中的多态性

    实际上这两个概念完全没有关系,仅仅都带有一个"重"字。他们没有在一起比较的意义,仅仅分辨它们不同的定义就好了。 3、虚方法:即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。...如: Animal a = new Animal(); a.EatFood(); 执行输出结果为: Animal吃东西 4、抽象方法:在基类中定义的并且必须在派生类中重写的方法,使用 abstract...5、隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用 new 关键字定义。...运行的结果如下: Animal Sleep Animal在23点Sleep 2、 //重写和虚方法 a.EatFood(); ac.EatFood(); ad.EatFood(); 在这一段中,a、ac...现在回到刚才的例子,Main 函数时程序的入口,在 JIT 编译器将 Main 函数编译为本地CPU指定时,发现该方法引用了 Biology、Animal、Cat、Dog这几个类,所以 CLR 会创建几个实例来表示这几个类型本身

    67020

    .NET面试题系列 - C# 基础知识(2)

    左边的是派生类,而b2的类型是B(在栈上的类型)。 D d4 = (D) d1; 可以执行。因为d1也是D类型,故没有发生实际转换。...在执行完上面所有语句之后,内存中的状况如图(省略了类型对象指针): ? D d6 = (D) b1; 运行时错误。在显式转换中,b1的类型是B,不能转换为其派生类D。...B b5 = (B) o1; 运行时错误。在显式转换中,o1的类型是基类Object,不能转换为其派生类B。 2.3 什么是拆箱和装箱?它们对性能的损耗体现在何处?...返回对象的地址。 注意,不需要初始化int的类型对象,因为其在执行程序之前,编译之后,就已经被CLR初始化了。 拆箱的过程 拆箱并不是把装箱的过程倒过来,拆箱的代价比装箱低得多。...string是基元类型String在c#中的别名,故这两者没有任何区别。 注意字符串在修改时,是在堆上创建一个新的对象,然后将栈上的字符串指向新的对象(旧的对象变为垃圾等待GC回收)。

    92210

    ILRuntime热更新

    CLR初始化时创建的第一个AppDomain称为“默认AppDomain”,这个默认的AppDomain 只有在Windows进程终止时才会被销毁。...优势 无缝访问C#工程的现成代码,无需额外抽象脚本API 直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net 4.6编译的DLL 执行效率是L#的10-20倍 选择性的CLR绑定使跨域调用更快速...由于IL2CPP之类的AOT编译技术无法在运行时生成新的类型,所以在创建委托实例的时候ILRuntime选择了显式注册的方式,以保证问题不被隐藏到上线后才发现。...大规模数值计算:如果在热更内需要进行大规模数值计算,则可以开启ILRuntime在2.0版中加入的寄存器模式来进行优化 避免使用foreach:尽量避免使用foreach,会不可避免地产生GC。...RunTest():170ms 可以明显看出CLR绑定对于方法执行耗时有显著的改善,同时先确定IMethod在Invoke会省去一定的查找时间,但对于性能的影响相对较小。

    2.4K30

    原 Introduction to the

    为一种语言构建良好的调试器和分析器是一项很大的工作, 只有最重要的编程语言才有这些完备的功能。 但是, 由于在 clr 上实现的语言可以重用此基础结构, 因此对任何特定语言的负担大大减少。...非托管方法不会使用托管参数,也不会返回托管类型,这意味着托管代码种创建的对象和对象句柄都必须显示的释放,不幸的时,非托管的API不能采用CLR的功能,例如异常和继承,与托管代码的接口相比,非托管代码的接口往往是不太美妙的体验...CLR惊喜的控制程序执行的方方面面(可能除了个别的指令),CLR会检测代码执行进入或者离开托管代码,这提供了多种有用的功能 2.调用非托管代码会产生额外的成本,同时非托管代码也不能使用GC,这事实上鼓励对非托管代码进行封装...如果一个一个类派生值一个基类,那么基类能用的地方,派生类也可以使用。相同的代码能够在不同的类型中使用,这边是多态。...实际上, 运行库使用此功能为匹配字符串 (System.Text.RegularExpressions) 创建专用代码, 并为序列化对象而生成代码以存储在文件或通过网络发送。

    80990

    CGAL的编译以及在VS中的使用

    其次注意VS版本的问题 这里我使用的是vs2015 VS2015选择XX.Y=14.0 VS2017选择14.1 VS2019选择14.2 然后无脑傻瓜操作进行安装 (建议整个配置里的所有文件都放在一个文件夹里...进入命令行 cd到boost的文件夹内 在该目录下运行bootstrap.bat 运行后会产生不b2.exe等文件 Boost非常大 建议只编译CGAL需要的依赖库 b2.exe --with-system...在VS中使用CGAL库 CMake build 如图继续进行Configue和Generate操作 然后检查一下CGAL文件夹目录中是否有build文件夹 接下来打开生成的CGAL.sln文件 在debug...新建工程 打开项目属性 在VC++的包含目录添加 D:\local\boost_1_71_0(安装boost_1_71_0的目录) D:\compile\cgal\auxiliary\gmp\include...\include\CGAL(编译生成CGAL的include目录) 在VC++目录的的库目录中添加: D:\compile\cgal\build\lib(编译生成CGAL的库目录) D:\compile

    64420

    在Windows10中Visual Studio2017中使用boost1.69.0

    Boost是由C++标准委员会部分成员所设立的Boost社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程等。...目前已经更新到了1.72.0版本,官网下载地址为:https://www.boost.org/users/history/version_1_72_0.html,由于我之前在自己Windows10系统上安装的是...上图中是针对MSVC编译器即Visual VC++编译boost1.69.0的版本, 其中msvc是VC++编译器的名称,12.0代表是VS2013的版本,14.0是VS2015的版本,14.1是VS2017...源代码文件:Boost_lambda_Demo.cpp 在VS2017中创建一个VC++的控制台空项目Boost_lambda,添加一个Boost_lambda_Demo.cpp文件,代码如下: #include...点击确定按钮后,再看程序中的红色报错提示没有了,说明项目中可以使用Boost库了,如下图所示: ? 运行结果如下图所示: ?

    4.4K31

    .net 读书笔记

    但并非所有的值类型都创建在线程的堆栈上,例如作为类的字段时,值类型作为实例成员的一部分也被创建在托管堆上;装箱发生时,值类型字段也会拷贝在托管堆上。...对 32 位处理器来说,应用程序完成进程初始化后,CLR 将在进程的可用地址空间上分配一块保留的地址空间,它是进程(每个进程可使用 4GB)中可用地址空间上的一块内存区域,但并不对应于任何物理内存,这块地址空间即是托管堆...String 类型无疑是程序设计中使用最频繁、应用最广泛的基元类型,因此 CLR 在设计上为了提升 String类型性能考虑,实现了一种称为 字符串驻留 的机制,从而实现了相同 字符串可能共享内存空间。...base 关键字 其用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例 属性访问器中,MSDN 中小结的具体功能包括: 调用基类上已被其他方法重写的方法。...多播委托返回值一般为void,不推荐在多播委托中返回非void的类型。 匿名方法和Lambda表达式提供了更为简洁的语法表现,而这些新的特性主要是基于编译器而实现的,在IL上并没有本质的变化。

    65010

    win10下使用vs2015编译支持xp系统的libcurl

    在我的一篇博客中写了编译libcurl的,那种方式编译的curl动态库在win7到win10上可以使用,但是在xp系统里就不能使用了,接下来讲解一种方法可以在xp系统里使用cur。...安装好perl后,可以尝试使用ppm install dmake命令来进行安装dmake模块,在我电脑里无法安装,因此直接使用dmake离线包。...编译供xp系统使用的不能用openssl的1.1版本,而应该用1.0版本,这里下载OpenSSL_1_0_2u 下载完成解压,使用vs2015的开发人员命令提示符进入到解压后的目录,在这里编译...使用vs2015打开curl工程 将解决方案配置改为如下所示: 右键libcurl工程,将平台工具集改为如下: 在vc++目录的包含目录和库目录设置为编译好的opensll...,把curl这个工程也进行相同设置,就可以编译出可以在xp系统里运行的libcurl。

    1.3K20

    C# try catch finally

    前言  catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。...如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是部署的程序,将会中止。   如果没有catch块,异常总是向上层(如果有)抛出,或者中断程序运行。...无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。...CLR在执行中也有栈,但这个栈的用途与传统的本地代码中的栈并不完全相同。...代码中当我们执行new时,对应的IL是newobj,其结果是创建一个TestClass2类型的对像并返回一个引用放置于栈上,之后的stloc就将这个引用保存为局部变量,于是栈上没有了其他内容。

    1.8K20
    领券