避免string.Format方法的装箱
2015-08-02 07:39
363 查看
我们知道,使用string.Format方法可能会存在装箱的情况。比如如下:
string.Format()方法接收的后两个形参类型是object,所以这里存在装箱。
现在查看IL代码:
→打开"开发人员命令提示"
→导航到应用程序所在的文件夹
→使用ildasm查看应用程序的il代码并输出到txt文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/e53877444bcbdfb11b83872366d54df8.png)
→打开1.txt文本文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/71585eeea661e10f9b02d346fc63d5d4.png)
→在IL代码中看到了2次装箱
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/b41dc54b1bd67414aa629f7e6ec7284d.png)
如果在我们的应用程序中多次频繁地调用string.Format方法,比如记录日志,那么对值类型装箱发生了很多次,也意味着会产生很多次的内存分配,发生很多次的垃圾回收。
如何解决呢?
--用字符串拼接
修改代码如下:
我们看到,通过字符串拼接,避免了装箱的发生。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/87ead2197afd55d1317e129259ac1f60.png)
static void Main(string[] args)
{
string s = string.Format("拼接{0}和{1}", 1, 2);
Console.WriteLine(s);
Console.ReadKey();
}
string.Format()方法接收的后两个形参类型是object,所以这里存在装箱。
现在查看IL代码:
→打开"开发人员命令提示"
→导航到应用程序所在的文件夹
→使用ildasm查看应用程序的il代码并输出到txt文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/e53877444bcbdfb11b83872366d54df8.png)
→打开1.txt文本文件
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/71585eeea661e10f9b02d346fc63d5d4.png)
→在IL代码中看到了2次装箱
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/b41dc54b1bd67414aa629f7e6ec7284d.png)
如果在我们的应用程序中多次频繁地调用string.Format方法,比如记录日志,那么对值类型装箱发生了很多次,也意味着会产生很多次的内存分配,发生很多次的垃圾回收。
如何解决呢?
--用字符串拼接
修改代码如下:
static void Main(string[] args)
{
string s = "拼接" + 1.ToString() + "和" + 2.ToString();
Console.WriteLine(s);
Console.ReadKey();
}
我们看到,通过字符串拼接,避免了装箱的发生。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/03/87ead2197afd55d1317e129259ac1f60.png)
相关文章推荐
- linux下gtk+一个将字符串大写化的小示例
- linux下gtk+一个将字符串大写化的小示例
- linux下gtk+一个将字符串大写化的小示例
- 集训目标
- nyoj17 单调递增最长子序列(DP)
- Android AsyncTask usage
- OSChina 周日乱弹 —— 长得好看有什么用
- iOS设计模式 - 抽象工厂
- 柯塔娜有什么本领?
- gps纠偏及大陆地图偏移原因
- css布局笔记
- SOM_PAK源码编译出现getline重定义问题的解决
- 我近期应该找个机会休整一下了
- 用Grid和GridSplitter布局和分割WPF窗口
- 透视图
- 【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】
- 【LeetCode-面试算法经典-Java实现】【066-Plus One(加一)】
- 【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】
- 在这雨秀的辊
- HackerRank - "Lego Blocks"