c# - 两个数据类型变量在 C# 中相互引用
问题描述
我有很长一段时间以来见过的最奇怪的错误。我在 Visual Studio 2017 中使用 C# 工作,我必须使用似乎引用内存中同一点的数据变量。
具体来说,我定义了函数
static void GetDataMoments(IEnumerable<double> vec, out double M2X, out double M2Y, out double M2XY, out double M1Y, out double M1X, out int N)
{
M2X = 0;
M2Y = 0;
M2XY = 0;
M1Y = 0;
M1X = 0;
N = 0;
foreach (var d in vec)
{
M1Y += d;
M2X += (++N) * N;
M2XY += d * N;
M2Y += d * d;
M1X += N;
}
// For checking
M1X = (N + 1d) * N / 2;
}
我有这个函数的错误,所以我用
double[] vec = Enumerable.Range(1, 100).Select(i => (double)i).ToArray();
这样,在任何时候M1X
都应该等于,并且类似地。M1Y
M2X == M2Y == M2XY
但是,调试该功能,在该foreach
部分的第一行,我得到M1Y
增加了 d (此时等于1
),而且M2Y
!
有没有人遇到过这个?我在 .Net Framework 4.6.2 和 4.7.2 中都运行了它,所以它与框架无关。
谢谢!
解决方案
造成这种情况的原因并不像 .NET 中的错误那样险恶或不幸,而只是因为您欺骗了自己。
请注意,我是在假设,但是由于我可以使用此假设证明您遇到的确切问题,这是我能想到的唯一原因(除了实际的错误),我认为这样说是相当安全的这是你的问题。
问题不在于问题中的代码,而在于调用它的代码。
我来给你展示:
public static void Test(out int a, out int b)
{
a = b = 0;
a++;
Console.WriteLine(b);
}
您希望此代码输出 0,因为它增加了a
,但不是b
。
但是,如果你这样称呼它:
int x;
Test(out x, out x);
您正在有效地制作a
并且b
两者都使用相同的变量,这使它们成为别名。
它会打印出来1
。
所以基本上你将同一个变量多次传递给你的方法。
推荐阅读
- android - 如何在中心制作 recyclerView 项目?
- scala - 在scala中递归读取文件
- python - 使用 windows 连接 PySpark 行
- javascript - 如何仅在对象内的所有 id 完成获取后才设置状态
- javascript - 需要帮助将多个音频文件静音
- python - 如何在 AzureStorageCheckpointLeaseManager 类中提供容器的完整路径
- c++ - 继承增加了类的大小
- mysql - 一旦连接限制达到,npm mysql 无法获取新连接
- .net - .Net Mvc 应用程序托管
- networking - UTP 电缆确实比用于串行通信的电缆更耐噪声吗?