标题  状态  内容

什么是CLR?

什么是托管模块?

托管模块由什么组成?

。net代码的执行过程

 

http://www.cnblogs.com/aaa6818162/p/4726581.html

http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.html

为了执行程序,首先必须把它的IL转换成本地CPU指令

第二次调用WriteLine的情况

PE文件   http://lwglucky.blog.51cto.com/1228348/283812/
 元数据的   http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html

元数据的逻辑结构类似于数据库中的表,所以被称为元数据表。元数据表有列和行,每一行都是不重复的,都有唯一的RID(表索引),RID就像是数据库表的主建。数据库有Schema,如每一列的类型,大小等,元数据也有类似的东西,他们被称为“元-元数据”,包含表中记录的大小,列的大小,偏移等。

.Net 托管模块与程序集的关系

   http://blog.csdn.net/kmguo/article/details/17055065
     

.NET概念:.NET程序编译和运行

 

http://blog.csdn.net/yysyangyangyangshan/article/details/7306346

应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点

   

  • 这段代码进行了几次装箱?

public static void Main() {

Int32 v = 5; // 创建值变量

Object o = v; // 装箱

v = 123; // Changes the unboxed value to 123

Console.WriteLine(v + ", " + (Int32) o); // Displays "123, 5" ,装箱两次

}

 验证四种判等方式  

①Object的静态方法ReferenceEquals:

 

只适用于判断两个引用是否指向同一个实例,不适用于值类型(或者说用于值类型是没意义的,因为永远返回false)。如下:

TestEqual te = new TestEqual();

bool b1= object.ReferenceEquals(te,te);

bool b2 = object.ReferenceEquals(1, 1);

b1为true,b2为false。b2为false的原因是两个整型值1装箱之后是两个不同的Object实例。

②Object中定义的实例级虚方法Equals:

 

其默认行为是判断引用是否相等,引用类型从Object中继承了这一行为,如下:

TestEqual te1= new TestEqual();

TestEqual te2 = new TestEqual();

bool b4= te1.Equals(te2);

bool b5 = te1.Equals(te1);

Console.WriteLine(b4);

Console.WriteLine(b5);

输出结果很明显第一个假,第二个真。

但是对于值类型来说,由于ValueType重写了这个方法,所以其行为不同,可以判断值是否相同,而不是引用。

如下:

int num1 = 15;

int num2 = 15;

bool b3 = num1.Equals(num2);

Console.WriteLine(b3);

虽然num1和num2是两个变量,但是只要它们的值一样,b3结果就为true。

③ = =运算符:

 

应用于值类型的时候其行为是判断值是否相等。应用于引用类型(String除外)的时候判断引用是否相同。

④Object中的静态方法Equals:

 

它接受两个Object类型的参数,它会调用第一个参数的实例级Equals方法,以第二个参数作为该方法的参数来进行判等。所以其行为表现出来和实例级的Equals方法一样。只是其内部添加了对于两个参加判等的参数是否本身已经是同一个引用的判断,还有两个参数是否为null的判断。

 常量const  

http://www.cnblogs.com/janes/archive/2011/07/11/2103215.html

常量是恒定不变的,在编译时就确定了它的值,编译后直接将值存到元数据中。变量类型只能是编译器能直接识别的基元类型,不能是引用类型,因为引用类型需要在运行时调用构造函数进行初始化。

通过ILDasm工具查看一下,const变量编译后为static literal类型,所以不难理解,常量是针对类的一部分,而不是实例的一部分

 只读字段readonly    类的数据成员通常用来保存一个值类型的实例或者指向引用类型的引用,CLR支持读写和只读两种数据成员,其中只读数据成员使用readonly修饰的
     其实很简单,C#中方法中的参数也是一个变量,这个变量也需要有一个地址。

对于引用类型的方法参数,传入的对象如果不加Ref,方法参数也就是这个变量也将被创建,不过因为是引用类型,所以地址直接指向所传入对象的地址。所以实际上是有两个变量,但都指向了同一处地址。
如果加了Ref,那么方法参数这个变量,将不被创建,也就是只有一个变量,指向了一处地址。

引用类型加不加Ref没有本质区别,只是多个了变量而已。

string/String类型作为参数是传值还是传址_AX

 

class Program
    {
        static void Swap(string a, string b)
{
            string c = a;
            a = b;
            b = c;
        }
       
        static void Main(string[] args)
        {
            string str1 = "Jenny";
            string str2 = "Benny";

Swap(str1, str2);

Console.WriteLine(str1);
            Console.WriteLine(str2);
            Console.Read();

}
    }

string在.net中是个特殊的对象,当把一个string传给一个方法时其实是做了一个“s=s”的操作,如果是其它对象,当然是前者得到后者的一个地址引用,而string对象每做一次赋值操作,被赋值的string都会重开一个内存空间将后者的值复制过来,所以才有了你的结果。
 
string类是引用类型,在赋值时是传址的。但如果用作函数参数的话系统会自动复制一个string类进行运算,因为函数默认是按值传递的。如果函数要传址,请在函数定义时,在参数前加上ref,在使用时也加上ref就可以了。

{
 7    class TestString
 8    {
 9        public static void Main()
10        {
11            string s = "AX";
12            Change(s);
13            Console.WriteLine(s);
14            Console.ReadLine();
15        }
16
17        private static void Change(string s)
18        {
19            s = "zhz";
20        }
21    }
22}

 C#友元程序集    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

CLR VIA的更多相关文章

  1. CLR 这些年有啥变化吗?

    引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...

  2. clr 元数据

    clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头.clr头.元数据.IL代码. 元数据和IL代码完全对应,保持一致(:>)性. 元数据有很多用途: VS的智能感知,自动补全: ...

  3. 不得不知的CLR中的GC

    引言 GC 作为CLR的垃圾回收器,让程序员可以把更多的关注度放在业务上而不是垃圾回收(内存回收)上.其实很多语言也有类似的东东, 如Java也有JIT 等等 GC基本概念 垃圾回收机制的算法有好多种 ...

  4. .Net 面试题 3C(CTS,CLS,CLR)

    1.CTS(Common Type System)通用类型系统 CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展.任何以.NET平台作为目标的语言必须建立它的数 ...

  5. MSSQLSERVER添加c# clr程序集的使用方法

    前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...

  6. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  7. CLR via C# 摘要二:IL速记

    最简单的IL程序 .assembly test {} .method void Func() { .entrypoint ldstr "hello world" call void ...

  8. CLR via C# 摘要一:托管程序的执行模型

    托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...

  9. CLR和.Net对象生存周期

    标签:GC .Net C# CLR 前言 1. 基础概念明晰 * 1.1 公告语言运行时 * 1.2 托管模块 * 1.3 对象和类型 * 1.4 垃圾回收器 2. 垃圾回收模型 * 2.1 为什么需 ...

  10. 【转载】保哥 釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係

    我常常不仅仅逛 博客园,还会去找国外,特别是台湾的技术部落格,发现好的文章,我便会收录,今天我转载或者全文复制,在Google 博客园,一位叫保哥, 釐清 CLR..NET.C#.Visual Stu ...

随机推荐

  1. Jeasyframe 开源框架 稳定版 V1.5 发布

    这是Jeasyframe开源框架的第一个稳定版本,感谢一起帮忙测试并给予反馈的网友们. 框架官网:http://www.jeasyframe.org/ 产品介绍: Jeasyframe开源框架是基于S ...

  2. 通过LinQ查询字符出现次数

    在一个项目中使用到一个问卷调查,在用户完成之后,需要统计所有题目中哪一个选项被选中次数最多. 我的实现方法是将所有题目选中的选项拼接为一个字符串,如:ABCADAA 在分析被选中次数的时候最初是将字符 ...

  3. [Xamarin] 透過WebClient跟網路取得資料 (转帖)

    之前寫過一篇文章,關於在Android上面取得資料 透過GET方式傳資料給Server(含解決中文編碼問題) 我們來回顧一下 Android 端的Code: 有沒有超多,如果是在Xaramin下面,真 ...

  4. C#函数式编程之标准高阶函数

    何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的.只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内.那么我们就将这类函数叫做高阶函 ...

  5. 用c#开发微信 (22) 微信商城 - 微信支付 (c#源码)

    微信支付有几种支付模式:刷卡支付,扫码支付,公众号支付,APP支付.本文介绍用于在微信商城里的公众号支付. 1. 效果图 在商城里购买商品后,到支付页面: 点击上面的确认支付,转到下面微信支付页面: ...

  6. javascript中数组揭秘

    js中的数组很强大,不仅仅是一个数组,更是一个无所不能的集合. 创建 可以使用 数组字面量 方式创建: var arr = [] 或者 var arr = new Array() 添加元素 arr.p ...

  7. 一键QQ聊天与一键加群QQ功能

    最新有项目要求,点击页面上的一个按钮,实现直接启动QQ聊天,添加QQ群的功能. 开始以为会很复杂,百度后发现QQ已经有考虑到这方面的需求,只需进入:QQ推广 -> 推广工具 就能看到如下界面

  8. crossplatform---bower解决js的依赖管理

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  9. JavaScript简介及基础知识(1)

    1.JavaScript是什么—它是个脚本语言,需要宿主文件,它的宿主文件是html文件. Javascript是一种脚本语言,比HTML要复杂.不过即便你先前不懂编程,也不用担心,因为Javascr ...

  10. 我和Java的故事-------第1弹

    前言:兴趣是学习任何新知识最好的老师 --------------------------------------------------------------------------------- ...