在重构其他人编写的代码时,我遇到了一些我不理解的奇怪现象,我希望有人可以解释为什么会这样.
if (mystring.Length != (mystring = mystring.Replace("!#", replacement)).Length)
{
i = 1;
}
else if (mystring.Length != (mystring = mystring.Replace("#", replacement)).Length)
{
i = -1;
}
Run Code Online (Sandbox Code Playgroud)
我认为这里会发生的事情是,由于括号具有最高优先级,括号内的赋值将首先发生,并且if和else if块中的任何代码都不会被执行.以下是我认为此代码实际上正在做的事情:
mystring = mystring.Replace("!#", replacement);
if (mystring.Length != mystring.Length)
{
i = 1;
}
else
{
mystring = mystring.Replace("#", replacement);
if (mystring.Length != mystring.Length)
{
i = -1;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为唯一可能发生的事情就是改变mystring,因为在比较之前会进行分配.测试结果表明发生的事情实际上更接近于此:
string temp1 = mystring.Replace("!#", replacement);
string temp2 = mystring.Replace("#", replacement);
if (mystring.Length != temp1.Length)
{
i = 1; …Run Code Online (Sandbox Code Playgroud) 我正在循环一个潜在的巨大(数百万项)数据集(存储在磁盘上)并拉出我要添加到的所选项目List<T>.当我将一个项目添加到列表中时,我会锁定它,因为有其他线程访问列表.
我试图在两种可能的实现之间做出决定:
1)每次我需要添加项目时锁定列表.
2)使用我在找到项目时添加项目的临时列表,然后用于List<T>.AddRange()将该列表中的项目添加到块中(例如,当我找到1000个匹配项时).这导致需要不经常请求锁定列表,但是如果AddRange()仅增加容量以足以容纳新项目,那么列表将最终重新调整大小很多次.
我的问题是:据我了解,每次添加一个项目将导致List<T>每次达到容量时a的内部容量增加一倍,但我不知道List<T>.AddRange()行为如何.我认为它只增加了容纳新物品的容量,但我找不到任何方法来证实这一点.关于如何在MSDN上增加容量的描述对于Add()和AddRange()几乎是相同的,除了对于AddRange它说如果新计数大于容量,则容量增加而不是如果Count已经是与容量相同.
对我来说,这就好像使用AddRange()来添加足够的项目以超过当前容量将导致容量增加,就像使用Add()将超过当前容量一样.
那么,List<T>.AddRange()在一个大到足以超过当前容量的块中添加项目会导致容量增加到足以容纳新项目,还是会导致容量加倍?或者它是否做了我甚至没有考虑过的其他事情?
希望这很清楚,没有任何代码示例,因为它是关于如何List<T>实现的一般性问题,但如果不是,我将添加任何将使我的问题更清楚的问题.如上所述,我已经阅读了MSDN文档,但找不到明确的答案.我在这里也搜索过任何类似的问题但找不到任何类似的问题,但如果有一个我错过的请指点我!