【发布时间】:2014-01-27 04:08:23
【问题描述】:
我在编写新的单元测试时遇到了一些问题。我在代码示例中的 cmets 解释了我的具体问题:
KeyboardLayout layout
= Engine.ParseLayout(Dimensions.Create(300, 300), "FooBar", provider);
var dweeb = layout.Layout.SelectMany(t => t);
//Parsed layout is not a mutant
Assert.IsTrue(!layout.IsMutant);
KeyboardLayout newLayout = StandardKeyboardMutations.MutateKeyboard(layout);
var newb = newLayout.Layout.SelectMany(t => t);
//I don't understand why this test fails. They should be stored in seperate memeory locations and therefore not equal by reference comparison.
//Unless of course saying var x = foo doesn't always provide a fresh memory location for the value of foo.
Assert.AreNotEqual(layout, newLayout);
这条线 Assert.AreNotEqual(layout, newLayout); 总是失败。
我不知道为什么我一直在做出这个假设(以 cmets 表示):声明一个变量总是将存储过程执行到一个新的内存位置。 (当前正在运行的程序未使用该程序)。
要清楚,问题是,在 c# 中, var x = foo; 是否总是使用新的内存单元?如果不是,使用一个的标准是什么?或者它总是将值的地址存储在 x 中?还是我错过了什么,我问了一个完全错误的问题来找出这里有什么问题?
这是我的第一次“官方”单元测试体验,提前致谢。
【问题讨论】:
-
我在
StandardKeyboardMutations上找不到任何文档。你有参考吗? -
自定义类。如果你想看看它的实现,我必须想出一个不同的例子。
-
答案可能在于它的实现。除非您已覆盖
KeyboardLayout.Equals,否则您将获得ReferenceEquals实现。这意味着StandardKeyboardMutations.MutateKeyboard以某种方式返回对 与layout相同的对象的引用 - 可能不是您想要的。
标签: c# variables reference equality