CIL之——值类型与引用类型的声明和使用
来源:互联网 发布:牙签弩淘宝20¥ 编辑:程序博客网 时间:2024/06/03 16:19
在C#代码中调用值类型的变量和调用引用类型的变量没什么区别,但是在CIL代码中就有不一样了,下面让我们看一下CIL代码是如何实现这一功能的吧!
C#目标代码
namespace ConsoleTest{ public class Program { public static void Main(string[] args) { Person objPerson = new Person(); WorkExperience resume = objPerson.GetResume(); Console.WriteLine("timeArea:{0} company:{1}", resume.TimeArea, resume.Company); int age = objPerson.GetAge(); Console.WriteLine("age:{0}", age); Console.ReadKey(); } } public class Person { private string name; private int age; private WorkExperience workExperience; public Person() { } public Person(string name, int age, WorkExperience workExperience) { this.name = name; this.age = age; this.workExperience = workExperience; } public WorkExperience GetResume() { WorkExperience workExperience = new WorkExperience("2010-06-11", "BigData"); return workExperience; } public int GetAge() { int age = 12; return age; } } public class WorkExperience { public string TimeArea { get; set; } public string Company { get; set; } public WorkExperience() { } public WorkExperience(string timeArea,string company) { this.TimeArea = timeArea; this.Company = company; } }}
对应CIL代码
.namespace ConsoleTest{ .class public Program extends [mscorlib]System.Object { .method public void .ctor() { .maxstack 8 ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } .method public static void Main(string[] args) { .entrypoint .maxstack 3 .locals init( //声明引用类型的局部变量必须加class关键字且类型必须使用类的全称 [0] class ConsoleTest.Person objPerson, [1] class ConsoleTest.WorkExperience resume, //声明值类型的局部变量直接使用类型即可 [2] int32 age ) newobj instance void ConsoleTest.Person::.ctor() stloc.0 ldloc.0 //返回值为引用类型时必须加class关键字且类型必须使用类的全称 call instance class ConsoleTest.WorkExperience ConsoleTest.Person::GetResume() stloc.1 ldstr "timeArea:{0} company:{1}" ldloc.1 //返回值为值类型时直接使用类型即可 call instance string ConsoleTest.WorkExperience::get_TimeArea() ldloc.1 call instance string ConsoleTest.WorkExperience::get_Company() call void [mscorlib]System.Console::WriteLine(string,object,object) ldloc.0 call instance int32 ConsoleTest.Person::GetAge() stloc.2 ldstr "age:{0}" ldloc.2 box int32 call void [mscorlib]System.Console::WriteLine(string,object) call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() pop ret } } .class public Person { .field private string name //声明值类型的字段时直接使用类型即可 .field private string age //声明引用类型的字段时必须加class关键字且类型必须使用类的全称 .field private class ConsoleTest.WorkExperience workExperience .method public void .ctor() { .maxstack 1 ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } //值类型的参数直接使用类型即可 //引用类型的参数必须加class关键字且类型必须使用类的全称 .method public void .ctor(string name,int32 age,class ConsoleTest.WorkExperience workExperience) { .maxstack 1 ldarg.0 call instance void [mscorlib]System.Object::.ctor() ldarg.0 ldarg.1 stfld string ConsoleTest.Person::name ldarg.0 ldarg.2 //对值类型的字段赋值时直接使用类型即可 stfld int32 ConsoleTest.Person::age ldarg.0 ldarg.3 //对引用类型的字段赋值时必须加class关键字且类型必须使用类的全称 stfld class ConsoleTest.WorkExperience ConsoleTest.Person::workExperience ret } //返回值为引用类型时必须加class关键字且类型必须使用类的全称 .method public class ConsoleTest.WorkExperience GetResume() { .maxstack 2 .locals init( class ConsoleTest.WorkExperience workExperience ) ldstr "2010-06-11" ldstr "BigData" newobj instance void ConsoleTest.WorkExperience::.ctor(string,string) stloc.0 ldloc.0 ret } //返回值为值类型时直接使用类型即可 .method public int32 GetAge() { .maxstack 1 .locals init( int32 age ) ldc.i4 12 stloc.0 ldloc.0 ret } } .class public WorkExperience { .field private string _timeArea .field private string _company .method public void .ctor() { .maxstack 1 ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } .method public void .ctor(string timeArea,string company) { .maxstack 2 ldarg.0 call instance void [mscorlib]System.Object::.ctor() ldarg.0 ldarg.1 call instance void ConsoleTest.WorkExperience::set_TimeArea(string) ldarg.0 ldarg.2 call instance void ConsoleTest.WorkExperience::set_Company(string) ret } .method public string get_Company() { .maxstack 1 .locals init( string company ) ldarg.0 ldfld string ConsoleTest.WorkExperience::_company stloc.0 ldloc.0 ret } .method public void set_Company(string val) { .maxstack 1 ldarg.0 ldarg.1 stfld string ConsoleTest.WorkExperience::_company ret } .method public string get_TimeArea() { .maxstack 1 .locals init( string timeArea ) ldarg.0 ldfld string ConsoleTest.WorkExperience::_timeArea stloc.0 ldloc.0 ret } .method public void set_TimeArea(string val) { .maxstack 1 ldarg.0 ldarg.1 stfld string ConsoleTest.WorkExperience::_timeArea ret } .property instance string Company() { .set instance void ConsoleTest.WorkExperience::set_Company(string) .get instance string ConsoleTest.WorkExperience::get_Company() } .property instance string TimeArea() { .set instance void ConsoleTest.WorkExperience::set_TimeArea(string) .get instance string ConsoleTest.WorkExperience::get_TimeArea() } }}
阅读全文
1 0
- CIL之——值类型与引用类型的声明和使用
- 指针和引用、复合类型的声明
- 【C#】—值类型与引用类型
- C#的数据类型——值类型和引用类型
- C#引用类型和值类型的区别——值类型和引用类型在内存中的部署
- C#之值类型与引用类型
- JavaScript之值类型和引用类型的区别
- c#之值类型和引用类型
- 明辨值类型和引用类型的使用场合
- 类型的使用---基元、引用和值类型(二)
- 类型的使用---基元、引用和值类型(一)
- 明辨值类型和引用类型的使用场合
- 明辨值类型和引用类型的使用场合
- 明辨值类型和引用类型的使用场合
- 值类型与引用类型的区别
- 值类型与引用类型的区别
- 值类型与引用类型的区别
- 值类型与引用类型的例子
- 【WEEX,MAC踩坑】Environment variable $ANDROID_HOME not found
- Eclipse安装Spring插件
- 【hackerrank】World CodeSprint 11 T6
- C语言程序设计(35)
- 形态学处理
- CIL之——值类型与引用类型的声明和使用
- 之江学院 K: qwb与小数(思维求A/B第n位小数)
- 【数据结构】线性表顺序结构之增删操作
- ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符
- vb.net 教程 5-16 图像处理之ImageAttributes 类2 颜色矩阵2
- redis 配置文件 redis.conf解读
- C语言数据结构——二叉链表
- 滚动哈希(Rabin-Karp算法)
- linux命令sort详解