直接处理字符串有什么好处,而不是将它分配给var?

时间:2017-04-25 10:56:14

标签: c# string memory-leaks

这样做有什么好处;

private void Method()
{
    var data = ConfigurationManager.AppSettings["Data"].Split('-');
}

而不是这样做;

private void Method()
{
    var _data = ConfigurationManager.AppSettings["Data"];
    var data = _data.Split('-');
}

案例:我需要在相同的方法中读取这样的一堆配置值,多次次(假设每次我实例化这个类)。

两种情况如何影响性能和记忆?或者他们几乎是一样的东西?我看到将它分配给变量会无缘无故地在内存上分配空间。

4 个答案:

答案 0 :(得分:3)

在这两种情况下都会生成相同的IL代码。

不要忘记The Rules of Code Optimization

答案 1 :(得分:2)

编译器会将这些减少到完全相同的东西。不,在这种情况下没有区别。如果您有好奇心,请在发布模式下进行编译,并使用ildasm查看它的作用。

然而!性能问题永远不应该通过预感来回答 - 甚至预感。首先,确定你是否真的试图解决一个真正的问题 - 否则你可能只是牦牛剃须。

答案 2 :(得分:1)

两种说法都是平等的。你对内存空间的分配有误解。这实际上发生在AppSettings - 呼叫内部,而不是在分配中。因此,当您对成员进行任何调用时,结果已经存在在内存中。将此值存储在变量中不会增加任何内容 - 无论是内存分配还是性能。

但是,如果你将结果存储在你班级的成员中,那么它将比你的本地data - 变量更早地被垃圾收集,因为它不会超出范围。在这种情况下,只要实例存在,将结果存储到成员就会分配内存。

说到这一点,在大多数情况下,更重要的是要专注于可维护的代码,即如果其他开发人员可以理解它而不询问所有这些。

这意味着您不应该问:which horse runs faster而是更容易理解哪些代码?

答案 3 :(得分:1)

在第一种情况下,由于string将返回Split(),因此使用ConfigurationManager.AppSettings["Data"]方法链接比创建额外变量没有任何害处。

在第二种情况下,如果将{{1}}用于多个位置,效率会很高。在这种情况下,不是一次又一次地获取它,而是一次获取它,将其存储到变量并重新使用它。