服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#编译器对局部变量的优化指南

C#编译器对局部变量的优化指南

2022-10-13 13:33冠军 C#

这篇文章主要给大家介绍了关于C#编译器对局部变量的优化指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题。

不考虑基本的对齐和换行美化。看一下局部变量优化问题。

C# 示例代码

例如,我们有一段如下的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
 class Program
 {
  static void Main(string[] args)
  {
   var s = DoSomething();
   Console.WriteLine(s);
  }
 
  static string DoSomething()
  {
   var s1 = "Hello, world.";
   var s2 = s1.ToUpper();
   return s2;
  }
 }
}

在 DoSomething() 这个方法中,里面定义了两个局部变量:

  • s1
  • s2

在 Main() 方法中,定义了一个局部变量:

  • s

定义 s1 和 s2 是为了提高代码的可读性,它们会导致生成冗余的代码,降低执行效率吗?

我们分别在 Debug 模式下和 Release 模式下进行编译,使用 ILDasm 查看生成的中间代码。

Debug 模式下生成的中间代码

在 Debug 下编译之后,DoSomething() 生成的中间代码如下,可以看到实际上有 3 个局部变量。除了我们自己定义的 s1 和 s2 之外,还有一个生成的 V_2,代码的尺寸为 20。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.method private hidebysig static string DoSomething() cil managed
{
 // Code size  20 (0x14)
 .maxstack 1
 .locals init ([0] string s1,
   [1] string s2,
   [2] string V_2)
 IL_0000: nop
 IL_0001: ldstr  "Hello, world."
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: callvirt instance string [mscorlib]System.String::ToUpper()
 IL_000d: stloc.1
 IL_000e: ldloc.1
 IL_000f: stloc.2
 IL_0010: br.s  IL_0012
 IL_0012: ldloc.2
 IL_0013: ret
} // end of method Program::DoSomething

看一下 Main() 方法。

有我们定义的 s 这一个局部变量,代码尺寸为 15 个字节。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size  15 (0xf)
 .maxstack 1
 .locals init ([0] string s)
 IL_0000: nop
 IL_0001: call  string ConsoleApp1.Program::DoSomething()
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: call  void [mscorlib]System.Console::WriteLine(string)
 IL_000d: nop
 IL_000e: ret
} // end of method Program::Main

Release 模式下生成的中间代码

而在 Release 模式下,实际上,DoSomething() 中所有的局部变量都被优化掉了。代码尺寸也只有 11 个字节。

?
1
2
3
4
5
6
7
8
.method private hidebysig static string DoSomething() cil managed
{
 // Code size  11 (0xb)
 .maxstack 8
 IL_0000: ldstr  "Hello, world."
 IL_0005: callvirt instance string [mscorlib]System.String::ToUpper()
 IL_000a: ret
} // end of method Program::DoSomething

还可以看一下 Main() 方法,这个局部变量 s 也被优化掉了。代码尺寸也只有 11 字节了。

?
1
2
3
4
5
6
7
8
9
.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size  11 (0xb)
 .maxstack 8
 IL_0000: call  string ConsoleApp1.Program::DoSomething()
 IL_0005: call  void [mscorlib]System.Console::WriteLine(string)
 IL_000a: ret
} // end of method Program::Main

结论

编译器会尽可能对代码进行优化,我们可以为了提高代码的易读性增加一些局部变量,这并不会导致生成冗余代码并导致执行性能的下降。

到此这篇关于C#编译器对局部变量优化的文章就介绍到这了,更多相关C#编译器对局部变量优化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/haogj/p/13889976.html

延伸 · 阅读

精彩推荐
  • C#C#制作多线程处理强化版网络爬虫

    C#制作多线程处理强化版网络爬虫

    这篇文章主要介绍了C#制作多线程处理强化版网络爬虫的相关代码,有想学习C#多线程编程的小伙伴可以参考下...

    7692021-12-06
  • C#Visual Studio 中自定义代码片段的方法

    Visual Studio 中自定义代码片段的方法

    这篇文章主要介绍了Visual Studio 中自定义代码片段的方法,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    vkvi4242022-08-29
  • C#详解c# 强制转换和类型转换

    详解c# 强制转换和类型转换

    这篇文章主要介绍了c# 强制转换和类型转换的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    olprod4922022-10-11
  • C#C#实现影院售票系统

    C#实现影院售票系统

    这篇文章主要为大家详细介绍了C#实现影院售票系统,解析了售票系统的难点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    可爱的黄油手3362022-03-09
  • C#C#与PHP的md5计算结果不同的解决方法

    C#与PHP的md5计算结果不同的解决方法

    今天在用C#接入我的登录api发现了一个问题,登陆的时候无论如何都会出现用户名和密码错误的问题,后来通过查找排除找的了问题的原因是因为C#与PHP的...

    ifengge3672021-12-15
  • C#C#登入实例

    C#登入实例

    本篇文章通过截图的方式向大家展示C#程序登陆实现的全过程,利用了C#三层架构的编写方法,希望对大家今后编写代码有所帮助...

    sctnl5842021-12-10
  • C#C# .NET中Socket简单实用框架的使用教程

    C# .NET中Socket简单实用框架的使用教程

    最近一个项目因为要用到Socket传输问题,所以决定学习一下,将自己学习的内容总结分享出来,下面这篇文章主要给大家介绍了关于C# .NET中Socket简单实用框...

    寒空飞箭4142022-01-21
  • C#C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

    C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

    在上个项目开发中遇到这样的需求,取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径。下面小编给大家分享C# 遍历文件夹子目录下...

    C#教程网5762021-12-21