初始化变量时使用新内存位置的标准是什么?

时间:2014-01-27 04:08:24

标签: c# variables reference equality

我在编写新的单元测试时遇到了一些问题。我在代码示例中的注释解释了我的具体问题:

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);始终失败。

我不知道为什么到目前为止我一直在做这个假设(在评论中说明):声明变量总是执行存储过程到新的内存位置。 (一个当前正在运行的程序没有使用它。)

要清楚,问题是,在c#中, var x = foo; 总是使用新的存储单元吗?如果没有,使用一个标准是什么?或者它可能总是在x中存储值的地址?或者我错过了什么,我完全在问错误的问题,找到错在哪里?

这是我第一次“官方”单元测试经验,提前谢谢。

2 个答案:

答案 0 :(得分:3)

您正在寻找Assert.AreSame而不是Assert.AreEqual

Assert.AreSame()断言检查参数是否引用相同的对象(您提到“相同的内存位置”),而Assert.AreEqual()(和AreNotEqual())断言检查是否相等对于基础对象,即它会检查a.Equals(b),即使ab引用不同的对象,它也可以成立。

答案 1 :(得分:2)

  

var x = foo;总是使用新的记忆细胞?

是的,x永远是新的记忆。但是,并不代表您认为的含义。

  

或者它可能始终存储在x地址value

是的,如果value类型是引用类型。 e.g。

var x = new MyClass();
var y = x;

xy都包含引用(您可以将其视为地址)到内存的同一个内存,其中MyClass()实例实际存储。

对于价值类型,它是完全不同的:

var x = new MyStruct();
var y = x;

分配给y时复制整个对象。没有引用,对象本身存储在y