重温C# clr 笔记总结

1: .net framework 由两个部分组成:CLR FCL

2:在CLR中,所有错误都是通过异常来报告的。

3:智能感知功能主要是靠解析元数据实现的

4:允许在不同语言之间方便的切换,并对各种语言进行紧密集成是CLR的出色特性。

5:一个方法只有在首次运行时才会由于jit造成一定的性能损失,以后对该方法的调用都以本地代码的形式全速运行。

6:方法签名指定了参数的数量(及其顺序),参数的类型;方法是否有返回值,如果有返回值,还要指定返回值的类型。

7:无论使用哪一种语言,类型的行为是完全一致的,因为类型的行为最终由CLR的CTS来定义。

8:使用[assembly:CLSCompliant(true)] 来检查CLS的相容性。

9:在同一程序集中,类型默认是internal,有一个原则是微软总是选择公开程度最低的关键字,比如默认的private。

10:在CLR中一个类型的每个成员要么是一个字段,要么是一个方法。

11:应答文件csc.rsp 的作用,使用/noconfig 开关忽略局部和全局csc.rsp.

12:元数据:二进制数据块,由几张表构成:分为3类:a:定义表,b:清单表,c:引用表。

13:一个托管的PE文件由4个部分构成,PE32(+)头,CLR头,元数据,IL。

14:程序集是一个或多个类型定义文件及资源文件的集合。

15:程序集允许我们分离可重用类型的逻辑和物理表示,如果一个程序集没有用到,那么它将永远不会下载。

16:为了生成一个新的程序集,来自一个引用程序集的所有文件都必须存在,但运行一个应用程序时,引用的程序集的所有文件不一定要全部存在。

17:程序集的版本号格式:主版本号,副版本号,Build号,Revision号。

18:[assembly:AssemblyCulture(“de-ch”)] 将程序集的语言文化设置为瑞士德语。

19:使用msi文件可以实现“即需安装”。

20:弱命名程序集之所有会成为问题,是因为几个不同的程序集可能具有相同的弱名称。

21:“Dll Hell” 根源:共享的Dll全部被复制到System32 目录中,弱命名的名称可能相同,最后安装的会覆盖前面的程序集。

22:之所以能将程序集拖放进GAC 依靠的是windows explorer shell (扩展) shFusion.dll.

23:在命令窗口cmd下,进入gac目录 查看gac的结构。

24:在安装.net framework 时,会安装两套副本,一套编译器/CLR目录,另一套:GAC 子目录。

25:ToString 方法默认反悔this.GetType().FullName.

26:GetType方法是非虚方法,这样就可以防止一个类重写该方法,隐瞒其类型,破坏安全性。

27:命名空间和程序集没什么关系

28:堆上的所有对象都包含两个额外的成员:类型对象指针和同步块索引

29:System.Object 的GetType方法返回的是存储在指定对象的“类型对象指针”成员中的地址。

30:GetType方法返回的是指向对象的类型对象的一个指针。

31:编译器直接支持的任何数据类型称为基元类型

32:在代表值类型实例的一个变量中,并不包含一个指向实例的指针,相反变量中包含实例本身的字段。

33:文档将所有值类型都称为一个结构 或一个枚举。

34:假如知道自己写的代码会造成编译器反复对一个值类型进行装箱,那么换用手动方式对值类型进行装箱,代码会更小更快。

35:总结第34条:降低调用浪费资源耗费时间多的步骤的次数。

36:使用接口的方式可以允许我们更改一个已装箱对象的字段,在C#中,不使用接口的方法是达到这个目的的。因为这个方式有点绕,所以不推荐使用需要修改字段的值类型,在设计模式中,值类型是不变的类型。

37:在内部,ValueType的Equals 方法使用反射技术来完成字段的比较,因为反射比较慢,所以在定义自己的值类型时,应重写Equals方法,不要调用base.Equals.具体的重写步骤如下:

a:如果obj == null –> false;

b: 参数引用不同对象  -> false;

c:每个字段都相等 –>check ->不相等(false)

d:true.

因为正确的重写Equals 方法比较复杂,在性能要求不是很严重的地方,可以不重写。

38:在需要修改一个哈希表的健值对时,正确的做法是 先移除再添加。

39:不要对哈希码 进行持久化 ,因为哈希码很容易改变,例如一个未来的版本可能使用一个不同的算法来计算对象的哈希码。

40:元数据的格式与源代码所使用的编程语言无关,因此元数据的格式都是相同的,元数据是所有语言都可以生成和使用的公共信息,是.net framework 开发平台的关键,它允许编程语言,类型和对象之间无缝集成。

41:对于任何可访问的成员,都必须定义在一个可见的类型内。

PS:类如果都看不到,你还能看到类里面的东西吗?

42:类型的可见性:public    internal(默认)

成员的可见性:public protected private (默认)

43:CLR要求接口的所有成员都是公开的, 接口是个契约,是个合同,所以成员都公开才有意义。

44:C# 编译器要求原始成员和重写成员必须具有相同的可访问性,CLR 允许成员的可访问性约束更低,而不允许更高。如果父类的某个方法是protected,那么子类重写这个方法的时候,可以选择约束更低的

public ,但是不能选择约束更强的private。

44:关键字 static 仅仅可以应用于类,不能应用于值类型(结构,枚举),因为值类型必须实例化,并且没有办法停止和阻止该过程。

45:静态类必须直接继承 System.Object ,因为继承性仅仅适用于对象。

46:静态类不能实现任何接口,因为只有使用类的实例才能调用接口的方法,可是静态类不能实例化。

47:只能定义静态成员,因为静态类不能实例化。

48:编译器不会在静态类 类型中生成实例构造器方法。

49:C# 编译器 完全支持部分类(partial type) 特征,但是CLR 却完全不支持,甚至CLR根本就没有

partial关键字。

50:对于类型字段:CLR 会在首次引用类型时才创建动态内存,也即jit 编译。

对于实例字段,创建类型实例时才分配存放字段的动态内存。

51:如果一个字段属于引用类型,并且被标记为readonly ,不可改变的是这个引用本身,而不是它所引用的对象。

52:构造器是允许将类型实例初始化为有效状态的特殊方法。

53:如果有多个实例构造器,最好通过this关键字先调用默认无参构造函数,然后再赋值。

public SomeType(int x,int y):this(){}

54:所有值类型的构造器必须初始化值类型的所有字段,因为值类型的任何字段必须在读取之前进行初始化。

55:类型构造器 最多只有一个,并且永远没有参数。

56:因为CLR保证每个应用程序域的类型构造器只执行一次,而且是线程安全的,所以最适合构造

singleton 模式

57:如果希望应用程序域关闭时能执行某些代码,我们可以在System.AppDomain的DomainUnload事件中注册一个回调方法。

58:当编译器查找FCL 中的核心数值(Int32,Int64)等基元类型的操作符时,会生成直接操作的IL指令,所以核心FCL 类型不能定义任何操作符重载方法的原因,因为方法调用会影响效率。

59:CLR规范将转换操作符重载方法定义为public 和static 方法。

60:只有方法的最后一个参数才可以使用params 关键字。

61:属性不能作为out 或ref 参数传递给方法,字段则可以。因为属性的本质是getter 和 setter.

62:C# 编译器 只允许接口定义方法,因为 事件,属性,索引器 本质上都是方法,所以也允许在接口中定义他们。

(0)

相关推荐

  • C#之CLR内存深入分析

    本文不再对值类型进行讨论,主要讨论一下引用类型.如要看内存值类型的朋友可以看一下前一篇C#之CLR内存原理初探. C#引用类型具体分析如下: 先来装备两个类: internal class Employee { public static Employee LookUp(string name) { return null; } public virtual string GetProgressReport() { return string.Empty; } } internal class

  • C#之CLR内存原理初探

    本文初步讲述了C#的CLR内存原理.这里所关注的内存里面说没有寄存器的,所以我们关注的只有托管堆(heap),栈(stack), 字符串常量池(其中string是一个很特殊的对象) 首先我们看两个方法: void M1() { string name = "Tom"; M2(name); } void M2(string name2) { int length = 10; double rate = 10.0; name2 = "Joe"; return; } 这里

  • 基于C#实现的仿windows左侧伸缩菜单效果

    本文所述为基于C#实现的折叠菜单,风格仿照Windows打开我的电脑后左侧的伸缩菜单效果,并且同样是蓝色的效果,看着和windows的效果一样漂亮,可以实现折叠.展开等功能.这在学习C#界面编程的时候能用上,其主要实现代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq

  • C# Pointer指针应用实例简述

    本文所述为在C#中使用Pointer指针的简单示例,非常适合新手参考学习.该实例演示了字符串的加密及解密的过程,将字符串指针p指向字符数组b,并将参数p传给函数,以及对给定字符串进行加密处理. 具体实例代码如下: using System; namespace PointerDemo { public class PointerDemo { public static void Main() { string s = "Hello Csharp!"; // 原字符串 Console.W

  • 带着问题读CLR via C#(笔记二)类型基础

    Q1: Object类型包含哪些方法? A1: Object类型共包含6个方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize. Q2: new一个对象的过程是什么? A2: 1)计算对象所需字节数,包括该类型及其基类型定义的所有实例字段所需的字节数和类型对象指针.同步块索引所需字节数,类型指针和同步块索引是CLR用来管理对象的:2)在托管堆上分配该对象所需内存空间:3)初始化类型对象指针和同步块索引:4)执行构造

  • C#实现装箱与拆箱操作简单实例

    本文以一个简单实例讲述了C#装箱和拆箱操作的实现方法,简单来说装箱是将值类型转换为引用类型:拆箱是将引用类型转换为值类型,是涉及栈和堆的使用方面的东西,学过C#的人应该都知道,所以这里就不哆嗦了,本例代码也是面向C#新手的,非常简单. 具体实现代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace UnBoxing { class Program {

  • 带着问题读CLR via C#(笔记一)CLR的执行模型

    Q1: 什么是CLR? A1: CLR (Common Language Runtime) 是一个可以由多种编程语言使用的"运行时". Q2: CLR的核心功能有哪些? A2: 1)内存管理:2)程序集加载:3)安全性:4)异常处理:5)线程同步 Q3: CLR与使用的编程语言有关吗? A3: 无关.只要编译器是面向CLR的就行. Q4: 选用不同编程语言经过面向CLR的编译器编译后生成的结果相同吗? A4: 相同.无论选择什么语言,相应的编译器变异的结果都是一个托管模块,即一个标准的

  • C# winform编程中响应回车键的实现代码

    本文介绍在使用C#进行窗体(WinForm)编程时,如何设置在窗口上按回车键的响应事件,或者说要响应按钮. 在窗体上按回车键,我们可以设置程序触发一些事件.这些事件都要通过窗体的AcceptButton这个属性来进行绑定. 在窗体的Load函数中,我们设置this.AcceptButton,这里的this表示是窗体对象本身.而AcceptButton即响应Enter回车键的按钮.它的值为当前窗体中的一个Button类型的控件的名称. 复制代码 代码如下: private void Form1_L

  • C#之CLR内存字符串常量池(string)

    C#中的string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorld")这样的重装也说没有的. 我们先来看一个方法: class Program { static void Main(string[] args) { String s = "HelloWorld"; Console.WriteLine(s); } } 然后我们用ildasm.exe工具把它生成IL语言来看一看它里面是怎么玩的: .met

  • 重温C# clr 笔记总结

    1: .net framework 由两个部分组成:CLR 和 FCL. 2:在CLR中,所有错误都是通过异常来报告的. 3:智能感知功能主要是靠解析元数据实现的. 4:允许在不同语言之间方便的切换,并对各种语言进行紧密集成是CLR的出色特性. 5:一个方法只有在首次运行时才会由于jit造成一定的性能损失,以后对该方法的调用都以本地代码的形式全速运行. 6:方法签名指定了参数的数量(及其顺序),参数的类型:方法是否有返回值,如果有返回值,还要指定返回值的类型. 7:无论使用哪一种语言,类型的行为

  • 重温JavaScript中的正则表达式 js学习笔记

    一.创建正则表达式 创建正则表达式和创建字符串类似 , 创建正则表达式提供了两种方法 , 一种是采用 new运算符,另一个是采用字面量方式. 复制代码 代码如下: var dog = new RegExp('dog'); // 第一个参数字符串 var dog = new RegExp('dog', 'ig'); // 第二个参数可选模式修饰符 var dog = /dog/; var dog = /dog/ig; //字面量方式. RegExp 对象包含两个方法 : test() 和 exec

  • angularjs学习笔记之完整的项目结构

    今天的主要讲解部分有以下几点:1.演示一个完整的项目结构 2.$scope的含义 3.模块化和依赖注入. 一.演示一个完整的项目结构. 下面的所有这些代码,都是转载于@大漠穷秋 老师的.我转载来之后放到了github上,大家可以去这个链接看源代码.一边看,一边学习,效果最好了---- 下面我们来看这个截图, 这就是一个完整的angularjs项目应该有的目录结构.下面我来讲解每一个文件夹对应的分别是什么含义. 1.css:不用说了,就是放一些css的样式文件. 2.framework:这里一般放

  • AngularJS学习笔记之TodoMVC的分析

    最近一段时间一直在看AngularJS,趁着一点时间总结一下. 官网地址:http://angularjs.org/ 先推荐几个教程 1. AngularJS入门教程 比较基础,是官方Tutorial的翻译. 2. 七步从AngularJS菜鸟到专家 也比较基础,制作了一个在线音乐播放网站. 3. AngularJS开发指南 这个教程比较全面,但我感觉翻译的有些晦涩难懂. 看过这些教程后,觉得AngularJS也懂一点了,就想用它干点事,就分析一下AngularJS写的todomvc吧. Tod

  • angularjs学习笔记之简单介绍

    一.angularjs简介 AngularJS 是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于,利用 数据绑定 和 依赖注入,它使你不用再写大量的代码了.这些全都是通过浏览器端的Javascript实现,这也使得它能够完美地和任何服务器端技术结合. 说了这么多,估计你啥都没有理解...对吗?别着急,我来说说他的几个特点吧:模块化,数据双向绑定,依赖注入,指令.下面我们就跟着这几个特点进行学习.

  • angularjs学习笔记之三大模块(modal,controller,view)

    今天主要跟大家详细讲解一下angularjs的三大模块: modal,controller,view. 首先跟大家说一下这三个模块之间的关系. 1.数据模型(modal)主要提供数据.它不会和视图(view)直接操作. 2.controller保存modal提供的数据,与视图进行操作. 3.view是视图,也就是页面展示. 4.总而言之,controller负责数据和视图之间的通信,就是两者的接口人.他们分工明确,实现了模块化. 一.如何使用数据模型(modal)? 讲到数据模型,我们再来看一下

  • Angular4学习笔记之新建项目的方法

    Angular4我自己还在摸索学习中,这个系列中的笔记会不定期修改和更新-- 一.安装nodejs(下面方式 二选一,个人推荐第二种) 1.nodejs官网下载安装 2.使用nvm安装管理(具体方式参照我的另一篇) 二.全局安装angular-cli npm install -g @angular/cli 三.进入一个存放项目的文件夹,运行以下代码,初始化项目 ng new <项目名> 四.启动项目 cd <项目名> npm install ng serve 附: 1.引入jQue

  • 详解angular笔记路由之angular-router

    本文介绍了angular笔记路由之angular-router,分享给大家,具体如下: 创建项目 ng new router --routing \\ 加routing参数 \\ 会新增一个app-routing.module.ts 文件 路由的基本使用 名称 简介 Routes 路由的配置,保存着哪一个URL对应展示哪一个组件和在哪一个RouterOutler展示 RouterOutler 在HTML中标记路由内容呈现的占位符指令 Router 运行时执行的路由对象,可以通过navigate(

随机推荐