- 浏览: 507330 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (299)
- Oracle(pl/sql_Erp_Pro*C) (69)
- 设计模式 (4)
- spring (23)
- ext (17)
- apache开源项目应用 (4)
- jquery (16)
- 生活琐事 (8)
- 下载资源 (23)
- mysql (2)
- Eclipse使用积累 (5)
- 报表类(报表/图表) (13)
- php (4)
- Web多彩文本框 (3)
- json (4)
- jqgrid (2)
- ant (2)
- java算法积累 (8)
- EL表达式/JSTL (4)
- poi (3)
- gwt (2)
- 爬网第一步 (2)
- javascript (17)
- Javaweb (8)
- tomcat (1)
- flex (1)
- Java&DB (3)
- J2SE (7)
- linux (3)
- 数据结构 (1)
- dot net (5)
- struts (1)
- ibatis (1)
- log4j (1)
- 项目管理 (1)
- Java native interface(jni,jacob......) (5)
- applet (1)
- VB.net/C#.net/JNI (20)
- css (1)
- Sqlite (1)
- servlet (1)
- REST (1)
最新评论
-
wenhurena:
能不能给一下解压密码roki.work.2017@gmail. ...
Ebs解体新書と学習資料1 -
liutao1600:
楼主写的太好了,每天学习~~
Spring_MVC(6)测试 -
liutao1600:
太好了,每天学习你的文章~~~
Spring_MVC(3)表单页面处理 -
liutao1600:
学习了,太好了
Spring_MVC(2)控制层处理 -
liutao1600:
学习了~~~
Spring_MVC(1)构建简单web应用
6.类型和成员基础
1.Class的可见性有public和internal两种,public对所有程序集都可见,internal仅对其所在的程序集可见。默认是public的。
2.友元程序集,
使用friend assembly可以实现单元测试,而不使用反射技术。
书上讲的是按照命令行编译。
我测试用的是vs2005的solution,如下:
3.成员的可访问性
成员默认是private的,接口类型的成员都是public的。
子类重写父类的成员时,原始成员与重写成员要有相同的可访问性——C#的约束;CLR的约束是,重写成员的可访问性不能更低。
CLR和C#是不一样的,如表:
CLR术语 C#术语
Private private
Family protected
Family and Assembly 不支持
Assembly internal
Family or Assembly protected internal
Public public
4.静态类
static只能用于class,不能用于struct,因为CLR要求值必须实例化,而且不能控制实例化过程。
C#对静态类的约束:
静态类必须直接从System.Object派生
静态类不能实现任何接口
静态类只能定义静态成员:字段,方法,属性,事件
静态类不能用作:字段,方法,参数,局部变量。
在MSIL中,不会为静态类生成ctor,会将其标记为abstract和sealed
5.部分类
CLR不支持partial,只是C#的语法。所以某个类型的源码必须使用同一种编程语言
6.组件,多态和版本控制
.NET版本号2.7.1.34,包含4个部分:主版本号,次版本号,内部版本号,修订版本号。
修订版本,向后兼容,改变内部/修订版本号;
发布新版本,不向后兼容,改变主/次版本号。
多态中,子类重写父类的虚方法,会引起版本控制问题,即父类发生改变,其版本低于子类版本,会导致子类行为变化。
C# 5个用于 类/类成员 的 影响组件版本控制 的 关键字:
abstract:用于类/类成员
virtual和override:用于成员
sealed:用于类/类成员。用于成员时,仅用于重写了虚方法的方法。
new,用于类/类成员/常量/字段
C#调用虚方法:
CLR允许类中定义多个"同名方法",仅仅是返回类型不同,IL允许这样做;C#不允许,忽略返回值的类型,相应的用"转换操作符"实现IL中的"同名方法"。
调用方法相应的MSIL:
一个是call,用来调用静态方法,实例方法和虚方法。必须要指定调用方法的类型(对于静态方法)或者对象(对于实例方法/虚方法),如果在该类型/对象中找不到该方法,会检查其基类来匹配方法。
另一个是callvirt,用来调用实例方法和虚方法,不能用于调用静态方法。必须要指定调用方法的实例对象,如果这个对象为null,会抛出NullReferenceException异常,这意味着每次调用前都会有额外的null检查,从而比调用call慢一些。
如下代码所示:
public sealed class Program
{
public Int32 GetFive()
{
return 5;
}
public static void Main()
{
Program p = null;
Int32 x = p.GetFive(); //在C#中,使用callvirt,会抛出NullReferenceException异常
}
}
在C#编译器中,使用callvirt调用所有实例方法(包括虚方法),使用call调用所有静态方法。对于其他的编译器,这一点不能保证,所以在虚方法和非虚方法之间改动而不重新编译,会产生无法预测的问题。
C#使用call而不用callvirt调用虚方法的特例:ToString,见下:
internal class SomeClass
{
public override string ToString()
{
return base.ToString();
}
}
这时候,生成call的IL代码。因为如果使用callvirt,意味着这时一个虚方法,从而递归执行该方法,直到AppDomain的堆栈溢出。
在调用值类型定义的方法时,使用call。这是因为,首先,值类型是密封的,从而不存在虚方法;另外,值类型永远不会为null,所以永远不会抛出NullReferenceException异常;再者,如果使用callvirt,就要使用装箱机制,性能会有极大影响。
在设计class的过程中,要尽量少定义虚方法。取代办法:可以定义一组重载方法,经其中最复杂的方法虚拟化,而将所有有用的重载非虚拟化,示例如下:
public class Set
{
private Int32 m_length = 0;
//这个有用的重载是非虚拟的
public Int32 Find(Object value)
{
return Find(value, 0, m_length);
}
//这个有用的重载是非虚拟的
public Int32 Find(Object value, Int32 startIndex)
{
return Find(value, 0, m_length - startIndex);
}
//功能最丰富的方法是虚拟的,可以被重写
public Int32 Find(Object value, Int32 startIndex, Int32 endIndex)
{
.//具体实现
}
}
sealed密闭类尽量使用。将sealed改为非密闭的容易,反之困难;性能也快,因为sealed一定是非虚拟的,从而编译器不用考font-size: 10pt; color: red; font-family:
发表评论
-
程序集与托管模块
2010-10-26 16:22 1205本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和 ... -
.NET程序集
2010-10-26 15:03 2196【主要内容】@将源代码 ... -
strong-named
2010-10-26 14:48 850前段时间自己整理的一个有关strong-named assem ... -
CLR笔记(一)
2010-10-26 13:22 17411.CLR的执行模型 ... -
Java调用C#
2010-10-25 22:49 1811Java调用C# 下载: http://www.co ... -
Managed Extensions for C++ Reference
2010-10-25 18:10 1350Managed Extensions for C++ Refe ... -
注入托管代码
2010-10-25 17:18 1697前言:本文的重点不在 ... -
jni调用dll及dll已用其它dll的资料
2010-10-25 16:00 865http://blog.csdn.net/KONGKONGWJ ... -
C# method calls within a Java program
2010-10-23 16:11 1035.net产生的比java晚,其类库的封装在某些方面也比ja ... -
走近COM Interop
2010-10-23 15:40 1591走近COM Interop—— RCW ... -
get chartobjects from VB.net
2010-10-18 10:34 1303Excel.Sheets sheets = oWB.Works ... -
VB.NET调用DLL实现方法解析
2010-10-13 10:43 3425VB.NET开发平台 ... -
VB.net 的Me My MyBase MyClass
2010-10-11 23:46 1982第一次接触 Visual Basic 中的 Me、My、M ... -
使用.Net访问Office编程接口(PIA和IA的区别)
2010-10-11 10:25 3453在这篇文章里面,我将向大家介绍如何在.Net中访问Offi ... -
Exposing .net Components to Com
2010-10-11 09:47 786http://www.codeproject.com/KB/C ... -
.net Com组件注册
2010-10-11 09:30 1925本文将详细为大家介绍一个java调用.net DLL的方法,以 ... -
vb.net 封装组件成com的方法
2010-10-10 17:16 1497前几天一直在研究如何将.net的组件封装成com供非托管代码调 ... -
Writing an Activex control in VB.net
2010-10-09 22:33 1376The problem with that example i ... -
VB set Excel color
2010-10-08 17:30 901Sub Macro3()'' Macro3 Macro' ' ...
相关推荐
这是国外一位程序员写的CLR Via C#读书笔记,写得挺好,拿出来跟大家分享
NULL 博文链接:https://teddywang.iteye.com/blog/794260
本篇文章是对以前学习C# clr做的一些笔记,现在拿出来和大家分享下,希望需要的朋友能参考一下
Nick 的学习CLR的总结, 其中使用大量图片说明CLR内部实现机制.
c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...
麻省理工学院算法导论中英文版习题笔记全\solution to CLR(算法导论习题答案).pdf
Q1: 什么是CLR? A1: CLR (Common Language Runtime) 是一个可以由多种编程语言使用的“运行时”。 Q2: CLR的核心功能有哪些? A2: 1)内存管理;2)程序集加载;3)安全性;4)异常处理;5)线程同步 Q3: CLR与使用...
A2: 1)计算对象所需字节数,包括该类型及其基类型定义的所有实例字段所需的字节数和类型对象指针、同步块索引所需字节数,类型指针和同步块索引是CLR用来管理对象的;2)在托管堆上分配该对象所需内存空间;3)初始...
请在纯DOS分别执行 CLR.BAT 和 FLASH.BAT,出现active……即成功。 注: 此SLIC 2.1的ID为"CB-01", 是官方原生版本. 此工具适合联想昭阳K46全系列笔记本(如果是SLIC 2.1,则不必Marker),以及同一代工厂出的其它序号...
而Remoting可以利用TCP/IP,二进制传送提高效率。 31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行...
1.深入.NET框架 ... CLR : Common Language Runtime 公共语言运行时 1.CTS Common Type System 通用类型系统 2.CLS Common Language Specification 公共语言规范 FCL : Framework Class Libary 框架类库
C# 程序在 .NET 上运行,而 .NET 是名为公共语言运行时 (CLR) 的虚执行系统和一组类库。 CLR 是 Microsoft 对公共语言基础结构 (CLI) 国际标准的实现。 CLI 是创建执行和开发环境的基础,语言和库可以在其中无缝地...
C#从入门到精通学习笔记.1.C#语言特性: 不可以直接操作内存,去掉了指针操作。用CLR中的GC来管理 面向对象:封装、继承、多态 支持HTML,XML,SOAP等 2.C#与.net框架的关系: C#只是.net框架所支持的一种语言。C#...
联想E46 Marker TOOL 工具 dos下运行 先运行clr.bat 再运行flash.bat
公共语言运行时(Common Language Runtime)(CLR): 提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的安全类型,提高代码的安全性和可靠想。 .NET Framework类库: 与CLR紧密集成,可以使用它...
联想笔记本 Lenovo E46 Marker 把E46marker文件夹里的所有文件拷入dos启动盘内(我用u盘做的)。网上介绍的方法多是先运行CLR.bat清除原有的SLIC文件
包含研究笔记和PoC代码的工具箱,用于武器化.NET的DLR 内容 脚本 描述 Kukulkan 精简版的 ,C#DLL和EXE嵌入了IPY引擎。 通讯已加密,可与CobaltStrike一起使用 Invoke-JumpScare.ps1 使用嵌入式Boolang编译器...