【发布时间】:2018-01-23 17:11:02
【问题描述】:
作为我对这段代码进行重构的一部分,我遇到了这个 sn-p 代码,我正在讨论什么更正确/更有效?
之前:
string CutHeadAndTail(string pattern)
{
if (pattern[0] == '*')
{
pattern = pattern.Substring(1);
}
if (pattern[pattern.Length - 1] == '*')
{
pattern = pattern.Substring(0, pattern.Length - 1);
}
return pattern;
}
之后:
private string RemoveAllowedAstrisks(string pattern)
{
pattern = pattern[0] == '*'?pattern.Substring(1): pattern;
pattern = pattern[pattern.Length - 1] == '*' ? pattern.Substring(0, pattern.Length - 1) : pattern;
return pattern;
}
什么更好?
我正在考虑pattern = pattern[0] == '*'?pattern.Substring(1): pattern;这一行
意思是,从可读性的角度来看,我更喜欢第二种。但另一方面,这个表达式的含义是以下两个选项:
-
pattern[0]=='*'--> 在这种情况下,模式将更改为pattern.Substring(1) -
else-->pattern = pattern
如果我选择第一种方式(忽略命名等),我只有第一种选择:
if (pattern[0] == '*') { pattern = pattern.Substring(1); }return pattern;
底线:pattern = pattern 行是否占用更多内存?
【问题讨论】:
-
1.正如汉斯指出的那样,这并不重要。 2.
string是一个引用类型,所以pattern = pattern什么都不做(好吧,我不确定转换为 IL 和机器代码,如果没有得到很好的优化,引用可能会从内存复制到 cpu 寄存器和再次回到相同的内存位置) -
我不担心性能,但我想知道是否真的有区别?
-
@Roni 检查差异的最简单方法是查看 IL。使用 LinqPad 或类似工具
-
最大的不同是原代码清晰易读。