`

c# 变量的 内联赋值 vs. 构造函数内赋值

    博客分类:
  • c#
c# 
阅读更多

上下文:c#中变量的内敛赋值其实是在构造函数中完成的,JIT会把变量的赋值语句放入每个构造函数开始的位置,因此,当类中有很多变量使用内联赋值,同时类也有多个构造函数的时候,实际编译生成的代码量会以乘法的方式叠加。比如一个类中有3个变量使用内联赋值,有4个构造函数,那么实际生成的赋值语句的数量将达到3x4=12句。

 

结论:尽量避免使用内联赋值,优先使用构造函数内赋值

 

 

类代码如下:

public class Cat

    {

        private string name;

 

        public Cat()

        {

 

        }

 

        public Cat(string _name)

        {

            name = _name;

        }

 

        public Cat(int _notuse)

        {

            name = "Hello Kitty";

        }

 

        public void Shout()

        {

            Console.WriteLine(name+" is now nyan nyan");

        }

 

    }

 

IL生成的代码如下:

//public Cat(string _name)

.method public hidebysig specialname rtspecialname 

        instance void  .ctor(string _name) cil managed

{

  // Code size       17 (0x11)

  .maxstack  8

  IL_0000:  ldarg.0//load argument 0,即,将this指针压栈

  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()//使用this并调用object构造函数

  IL_0006:  nop

  IL_0007:  nop

  IL_0008:  ldarg.0//将this指针压栈

  IL_0009:  ldarg.1//将_name压栈

  IL_000a:  stfld      string DLLTest.Cat::name//将栈顶的值赋给name

  IL_000f:  nop

  IL_0010:  ret//返回

} // end of method Cat::.ctor

 

 

//public Cat(int _notuse)

.method public hidebysig specialname rtspecialname 

        instance void  .ctor(int32 _notuse) cil managed

{

  // Code size       21 (0x15)

  .maxstack  8

  IL_0000:  ldarg.0

  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()

  IL_0006:  nop

  IL_0007:  nop

  IL_0008:  ldarg.0

  IL_0009:  ldstr      "Hello Kitty”//将”Hello Kitty”压栈

  IL_000e:  stfld      string DLLTest.Cat::name

  IL_0013:  nop

  IL_0014:  ret

} // end of method Cat::.ctor

 

 

//public Cat()

.method public hidebysig specialname rtspecialname 

        instance void  .ctor() cil managed

{

  // Code size       10 (0xa)

  .maxstack  8

  IL_0000:  ldarg.0

  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()

  IL_0006:  nop

  IL_0007:  nop

  IL_0008:  nop

  IL_0009:  ret

} // end of method Cat::.ctor

 

 

从上面3个构造函数的IL代码可以看出,当变量不使用内联赋值的时候,构造函数内不会自行补充赋值语句

下面将贴上内联赋值的Cat

 

public class Cat

    {

        private string name="Hello Tom";

 

        public Cat()

        {

 

        }

 

        public Cat(string _name)

        {

            name = _name;

        }

 

        public Cat(int _notuse)

        {

            name = "Hello Kitty";

        }

 

 

        public void Shout()

        {

            Console.WriteLine(name+" is now nyan nyan");

        }

 

    }

 

其构造函数分别是:

 

.method public hidebysig specialname rtspecialname 

        instance void  .ctor(string _name) cil managed

{

  // Code size       28 (0x1c)

  .maxstack  8

  IL_0000:  ldarg.0//this压栈

  IL_0001:  ldstr      "Hello Tom”//将”Hello Tom”压栈

  IL_0006:  stfld      string DLLTest.Cat::name//将”Hello Tom”赋值给this.name

  IL_000b:  ldarg.0

  IL_000c:  call       instance void [mscorlib]System.Object::.ctor()

  IL_0011:  nop

  IL_0012:  nop

  IL_0013:  ldarg.0

  IL_0014:  ldarg.1

  IL_0015:  stfld      string DLLTest.Cat::name

  IL_001a:  nop

  IL_001b:  ret

} // end of method Cat::.ctor

 

其他构造函数中同样会增加赋值的那三句

 

.method public hidebysig specialname rtspecialname 

        instance void  .ctor(int32 _notuse) cil managed

{

  // Code size       32 (0x20)

  .maxstack  8

  IL_0000:  ldarg.0

  IL_0001:  ldstr      "Hello Tom"

  IL_0006:  stfld      string DLLTest.Cat::name

  IL_000b:  ldarg.0

  IL_000c:  call       instance void [mscorlib]System.Object::.ctor()

  IL_0011:  nop

  IL_0012:  nop

  IL_0013:  ldarg.0

  IL_0014:  ldstr      "Hello Kitty"

  IL_0019:  stfld      string DLLTest.Cat::name

  IL_001e:  nop

  IL_001f:  ret

} // end of method Cat::.ctor

 

 

.method public hidebysig specialname rtspecialname 

        instance void  .ctor() cil managed

{

  // Code size       21 (0x15)

  .maxstack  8

  IL_0000:  ldarg.0

  IL_0001:  ldstr      "Hello Tom"

  IL_0006:  stfld      string DLLTest.Cat::name

  IL_000b:  ldarg.0

  IL_000c:  call       instance void [mscorlib]System.Object::.ctor()

  IL_0011:  nop

  IL_0012:  nop

  IL_0013:  nop

  IL_0014:  ret

} // end of method Cat::.ctor

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    内联汇编2.rar

    内联汇编2.rar

    易语言源码易语言置入代码内联汇编源码.rar

    易语言源码易语言置入代码内联汇编源码.rar 易语言源码易语言置入代码内联汇编源码.rar 易语言源码易语言置入代码内联汇编源码.rar 易语言源码易语言置入代码内联汇编源码.rar 易语言源码易语言置入代码内联汇编...

    类的继承和构造函数

    类的继承以及构造函数,包括私有继承、公有继承的区别,详细的构造函数的使用

    28-内联和内部.html

    28-内联和内部.html

    高质量C++/C编程指南

    8.5 函数内联... 65 8.6 一些心得体会... 68 第9章 类的构造函数、析构函数与赋值函数... 69 9.1 构造函数与析构函数的起源... 69 9.2 构造函数的初始化表... 70 9.3 构造和析构的次序... 72 9.4 示例:类String的...

    高质量C++-C编程指南.htm

    8.5 函数内联... 65 8.6 一些心得体会... 68 第9章 类的构造函数、析构函数与赋值函数... 69 9.1 构造函数与析构函数的起源... 69 9.2 构造函数的初始化表... 70 9.3 构造和析构的次序... 72 9.4 示例:类...

    高质量C++编程指南 chm

    8.5 函数内联... 65 8.6 一些心得体会... 68 第9章 类的构造函数、析构函数与赋值函数... 69 9.1 构造函数与析构函数的起源... 69 9.2 构造函数的初始化表... 70 9.3 构造和析构的次序... 72 9.4 示例:...

    高质量C++&C编程指南

    8.5 函数内联... 65 8.6 一些心得体会... 68 第9章 类的构造函数、析构函数与赋值函数... 69 9.1 构造函数与析构函数的起源... 69 9.2 构造函数的初始化表... 70 9.3 构造和析构的次序... 72 9.4 示例:类...

    易语言置入代码内联汇编源码.rar

    易语言置入代码内联汇编源码.rar

    易语言置入代码内联汇编源码.7z

    易语言置入代码内联汇编源码.7z

    高质量C++-C编程指南

    8.5 函数内联... 65 8.6 一些心得体会... 68 第9章 类的构造函数、析构函数与赋值函数... 69 9.1 构造函数与析构函数的起源... 69 9.2 构造函数的初始化表... 70 9.3 构造和析构的次序... 72 9.4 示例:类String的...

    HTML5内联框架案例.pdf

    HTML5内联框架案例.pdf 学习资料 复习资料 教学资源

    google C++ 风格指南 - 中文版

    1.3. 内联函数 1.4. -inl.h文件 1.5. 函数参数的顺序 1.6. #include 的路径及顺序 译者 (YuleFox) 笔记 2. 作用域 2.1. 名字空间 2.1.1. 匿名名字空间 2.1.2. 具名的名字空间 2.2. 嵌套类 2.3. 非成员函数, ...

    行业-电子政务-内联发电机.zip

    行业-电子政务-内联发电机.zip

    高质量C++C编程指南(非扫描高清版)(林锐博士)

    8.5 函数内联. 8.6 一些心得体会. 第9 章 类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源. 9.2 构造函数的初始化表. 9.3 构造和析构的次序. 9.4 示例:类STRING 的构造函数与析构函数 9.5 ...

    高质量C/C++编程指南(PDF)

    8.5 函数内联. 8.6 一些心得体会. 第9 章 类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源. 9.2 构造函数的初始化表. 9.3 构造和析构的次序. 9.4 示例:类STRING 的构造函数与析构函数 9.5 不要轻视...

    自编自用的c++语法快速参考

    23.构造函数: 7 24.析构函数: 8 25.复制类的对象: 8 26.初始化和赋值的区别: 8 27.友元(friend): 8 28.常量成员和常量函数: 9 29.类型转换函数: 9 30.内联函数(inline): 9 31.提前不完全声明: 9 ...

    内联函数-14.08.25

    对 C++ 内联函数进行了说明

    高质量C_C++编程指南

    第 1 章 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第 2 章 程序的版式 ...8.5 函数内联 ........................................

Global site tag (gtag.js) - Google Analytics