【发布时间】:2018-10-18 15:25:46
【问题描述】:
我有以下 C# 程序:
class Program
{
static int[] foo = new int[1];
static void Main()
{
foo[0] = Get();
Console.WriteLine(foo[0]); //print "0"
}
static int Get()
{
foo = new int[1];
return 5;
}
}
从Main() 调用Get() 后,我希望foo 数组在第一个位置包含5。但是,它为零。为什么会这样?
这就像 C# 在调用 Get() 方法时捕获对 foo 的引用。
这个旧的数组引用然后用于分配Get() 返回值(而不是在Get() 中实例化的新值)。
【问题讨论】:
-
您的问题已包含答案。没有问题要回答了。
-
为什么选择这样的设计?是执行原因吗?它在一个项目中产生了一个错误,我花了很长时间才发现,因为对我来说,这不是预期的行为。
-
我会质疑修改数组并返回值以便稍后插入到同一个数组变量中的设计选择。
-
如果你想知道微软为什么按照他们的方式设计语言,那就问他们,而不是问 SO。老实说,我会说在同一个语句的多个点读取和改变同一个变量是不好的做法,正是因为它会导致这样的错误。您编写的代码仅在以非常特定的顺序计算表达式的顺序时才有效,并且您编写它时假设顺序与实际顺序不同。您编写的代码依赖于在同一语句中观察到的副作用。不要那样做。
标签: c# arrays methods return-value