【发布时间】:2013-01-12 09:45:52
【问题描述】:
asking this question 之后,我还有一个问题。
我得到了两个很好的答案,但我仍然无法找到 这实际上是如何发生的:(故障情况怎么会发生):
我将从一个例子开始:
public void Do(string [] g)
{
g=null; //<========
}
void Main()
{
var t=new string[3];
t[0]="1"; t[1]="1"; t[2]="1";
Do( t);
Console.WriteLine ( t.Length);
}
注释行可以在不同的线程中执行,但每个线程都有其自己的 g 变量!
(请记住,我无法将项目添加到数组中。因为数组长度是在创建时创建的)
无论我将如何处理 函数 Do -(无论在哪个线程中),Console.Writeline 结果将始终为 3(除非使用 ref)。
让我们看看真正的代码:
public static string Concat(params string[] values)
#1 {
#2 if (values == null)
#3 {
#4 throw new ArgumentNullException("values");
#5 }
#6 int totalLength = 0;
#7 string[] strArray = new string[values.Length];
#8 for (int i = 0; i < values.Length; i++)
#9 {
#10 string str = values[i];
#11 strArray[i] = (str == null) ? Empty : str;
#12 totalLength += strArray[i].Length;
#13 if (totalLength < 0)
#14 {
#15 throw new OutOfMemoryException();
#16 }
#17 }
#18 return ConcatArray(strArray, totalLength);
#19 }
我的说法是:一旦我在 #1 上,在线程 X 中,这个线程将永远拥有长度为 3 的数组。
如果另一个线程想要销毁/更改数组长度(我无法理解如何,因为数组有固定长度,他所能做的就是让它@ 987654329@) - 它将有一个不同的指针地址副本。
我一定是错过了什么。
我错过了什么?
其他线程可以执行哪些代码会导致错误?(假设我们不复制数组)。
【问题讨论】:
-
@ilya 行号对于我的问题和答案参考是必需的。请不要删除它们。
-
3 分钟后投反对票的问题真的很愚蠢,因为问题需要至少 5 分钟才能明白。
-
问题不在于如果有人更改了局部变量 g 的值。问题是如果有人更改了
g[0]的值怎么办?这不会改变数组 t 的长度,但会改变数组 t 中的所有字符串的总长度。
标签: c# .net string multithreading